English 中文(简体)
具有约束力的模式不起作用
原标题:Model Binding not working

我有以下POCO课程:

public class Location
    {
        public int LocationId { get; set; }
        public string Name { get; set; }
        public string Street { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string ZipCode { get; set; }
        public string Country { get; set; }
        public float? Latitude { get; set; }
        public float? Longitude { get; set; }
        public string PhoneNumber { get; set; }
        public string EmailAddress { get; set; }
        public string Website { get; set; }
        public virtual ICollection<Program> Programs { get; set; }
        public virtual ICollection<PlayerType> PlayerTypes { get; set; }
    }

public class PlayerType
    {
        public int PlayerTypeId { get; set; }
        public string Name { get; set; }
        public int SortOrder { get; set; }
        public bool IsActive { get; set; }
        public virtual ICollection<Location> Locations { get; set; }
    }

和视觉模型类

public class LocationViewModel
    {
        public Location Location { get; set; }
        public IList<PlayerType> SelectPlayerTypes { get; set; } 

        public LocationViewModel()
        {
            Location = new Location();
        }

    }

在我的创建表格中,我将模型定义为

@model Locator.Models.LocationViewModel

并有如下字段:

div class="editor-label">
    @Html.LabelFor(model => model.Location.Name)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Location.Name)
    @Html.ValidationMessageFor(model => model.Location.Name)
</div>

在我的控制器里 处理POST,我有

[HttpPost]
        public ActionResult Create(LocationViewModel location)
        {
            if (ModelState.IsValid) {
                locationRepository.InsertOrUpdate(location.Location);
                locationRepository.Save();
                return RedirectToAction("Index");
            }
            location.SelectPlayerTypes = golferTypeRepository.All.Where(p => p.IsActive).ToList();
            return View(location);
        }

问题是,我有一个位置对象, 但任何属性都无法设定在窗体中输入的值。

我做错什么了吗?

谢谢 谢谢

最佳回答

问题在这里:

[HttpPost]
public ActionResult Create(LocationViewModel location)

您看到它吗? 它是您动作参数的名称 : place .

查看您现在的视图模型, 它有一个名为 Location 的属性 :

public Location Location { get; set; }

这将混淆模型集。 它不再知道您是否需要约束 LocationViewModel 或其属性 。

简单重命名以避免冲突:

[HttpPost]
public ActionResult Create(LocationViewModel model)
问题回答

我花了几小时寻找我的代码错误, 夹子在我的情况中不起作用的原因是使用公共领域而非公共财产的模式:

public int CustomerName;

并且应当:

public int CustomerName { get; set; }

在ASP.NET MVC上工作了3年了,而我以前从未遇到过这种情况。 希望这样能省下一些人的挫折感。 )

也很晚才加入该党, 但经过三年的 asp. net mvc, 我发现, 残疾人的投入没有张贴, 所以模型粘合器当然无法约束它们。 见 < a href=" http://www.w3schools.com/tags/att_intopt_ disfabild.asp" rel=" nofollow noreferrerr" >这里 :

“表格中的残疾要素将不予提交”。

最好使用 read only=>“ 仅读' 表示禁用。 见< a href=> https://stackoverflow.com/ questions/2700696/how-do- i- submit- dispact- in- asp- net- mvc > > 这里 。

Just to reiterate what Tod was saying, the model binder needs a name attribute on the HTML element to map the properties. I was doing a quick test form by hand and only used the id attribute to identify my elements.

当我添加了名称属性时,所有东西都落到实处了。

<input type="text" id="Address" name="Address" />

请允许我在此补充另一个理由,说明为什么模范装订器不能发挥适当作用。

我有一个属性 < code> ContactPhone 的模型, 在我决定将该属性的名称更改为 < code> phone 的路上, 当我试图创建一个新实例时, 突然将该属性绑在一起的模型停止工作 。

问题在于我的控制器中的 reate 动作。 我使用了默认的视觉工作室脚架, 并创建了方法签名 :

public ActionResult Create([Bind(Include = "Id,ContactPhone, ...")] Customer customer)
{ ... }

注意 Bind 属性, 脚手架用原名 ContactPhone 创建了字段, 由于这是一个字符串, 它没有被重新构思。 由于新字段 < code> phone 未被包含, 它被模型集忽略了 。

我希望这样能节省时间

祝你好运!

And another reason: Normally I use the built in editors or displays for and would have never encountered this issue. However in this case I required a semi-custom control. Basically a drop down with lots of data attributes on the options.

我所做的是,因为我选择的标签是:

<select name="@Html.IdFor(x => x.SubModel.ID)" id="@Html.IdFor(x => x.SubModel)" class="form-control select-control">

现在,一切都被放回原处,没有经过训练的眼神,看起来一切都应该起作用和捆绑起来。然而, IdFor 帮助者用一个强调来创建子模型。 模型捆绑者不把强调解释为一个等级等级指标。 区别它们应该是一个点。 它来自 NameFor :

<select name="@Html.NameFor(x => x.SubModel.ID)" id="@Html.IdFor(x => x.SubModel)" class="form-control select-control">

我所有问题都解决了

对于仍有问题的其他任何人,如果您在日志方法中指定参数与您的属性相同,则默认的模型启动器也将失败。

我的是一个有点独特的案例, 但希望它能帮助类似背景中的某个人。 我有我的 View Model 实施IValidableObject, 这个界面的校验方法正在返回一个无效的, 如果成功的话。 它必须返回一个空的 IEO 。 因此, 绑定实际上正在发生, 但崩溃了 。

基本上当您得到这个问题时, 使用小提琴手查看已公布的数据, 确保已公布的变量与您视图模型的属性( 不是字段!) 匹配, 并在 View Model 构建器上设置一个断点, 以确保 Routing 引擎点击正确的 POST 方法 。 祝好运!

这拯救了我的一天, 包括以下内容:

public ActionResult Edit(int masterId, ConclusionView conclusion)

ClubionView 有一个名为 Clubion 的属性,所以我几乎疯了。

我知道现在发表评论为时已晚。





相关问题
WebForms and ASP.NET MVC co-existence

I am trying to make a WebForms project and ASP.NET MVC per this question. One of the things I ve done to make that happen is that I added a namespaces node to the WebForms web.config: <pages ...

Post back complex object from client side

I m using ASP.NET MVC and Entity Framework. I m going to pass a complex entity to the client side and allow the user to modify it, and post it back to the controller. But I don t know how to do that ...

Create an incremental placeholder in NHaml

What I want to reach is a way to add a script and style placeholder in my master. They will include my initial site.css and jquery.js files. Each haml page or partial can then add their own required ...

asp.net mvc automapper parsing

let s say we have something like this public class Person { public string Name {get; set;} public Country Country {get; set;} } public class PersonViewModel { public Person Person {get; ...

structureMap mocks stub help

I have an BLL that does validation on user input then inserts a parent(PorEO) and then inserts children(PorBoxEO). So there are two calls to the same InsertJCDC. One like this=>InsertJCDC(fakePor)...

ASP.NET MVC: How should it work with subversion?

So, I have an asp.net mvc app that is being worked on by multiple developers in differing capacities. This is our first time working on a mvc app and my first time working with .NET. Our app does not ...

System.Web.Mvc.Controller Initialize

i have the following base controller... public class BaseController : Controller { protected override void Initialize(System.Web.Routing.RequestContext requestContext) { if (...

热门标签