【问题标题】:Asp.net MVC2 ModelBindingContext.ModelName emptyAsp.net MVC2 ModelBindingContext.ModelName 为空
【发布时间】:2010-09-14 03:39:36
【问题描述】:

我什至不太确定从哪里开始解释这个问题。在过去的 10 个小时里,我一直在研究这个问题,但不知道根本原因是什么。如果需要任何其他详细信息,我很乐意提供。我只是在猜测什么是相关的。

我有一个 MVC2 站点,其路由由 Steve Hodgkiss 的精彩 RestfulRouting 包设置,使用带有嵌套控制器的默认路由设置(例如 /customer/{custid}/location/{locid} 等)。

在这方面,我有一个给我带来问题的特定模型。出于某种原因,当创建页面将数据发送回我的服务器时,ModelBindingContext 对象中的 ModelName 属性传递给 DefaultModelBinder(好吧,我的自定义类继承自 DefaultModelBinder,以处理从存储库中抓取对象)。这只发生在这一个模型上。而且我根本无法发现差异。

破碎的模型

public class RemedialItem : Entity
{
   public virtual int Id { get; set; }
....

一个工作模型:

public class Customer : Entity
{
   public virtual int Id { get; set; }
....

Entity 只是一个空类,用作反射使用的标记。

RemedialItemController.cs中的坏控制器方法

[HttpGet]
public ActionResult New(int? locationId, int? applianceId)
{
   var model = ViewModelFactory.Create<CreateRemedialItemViewModel>();
   model.Categories = (from c in repository.Query<RemedialItemCategory>()
                       orderby c.Name
                       select c).ToList();
   model.RemedialItem = new RemedialItem();
   return View(model);
}

CustomerController.cs 中的工作控制器方法

[HttpGet]
  public ActionResult New()
  {
     var viewModel = ViewModelFactory.Create<SingleCustomerViewModel>();
     viewModel.Customer = new Customer();

     return View(viewModel);
  }

ViewModelFactory 是一个注入类,负责设置所有视图模型共有的一些基本属性(主要是当前登录的用户和用户详细信息)

一个损坏的视图模型:

public class CreateRemedialItemViewModel : ViewModelBase
{
   public RemedialItem RemedialItem { get; set; }
   public IList<Location> Locations { get; set; }
   public IList<Appliance> Appliances { get; set; }
   public IList<RemedialItemCategory> Categories { get; set; }
}

一个工作的 ViewModel:

public class SingleCustomerViewModel : ViewModelBase
{
   public Customer Customer { get; set; }
}

ViewModelBase 包含由 ViewModelFactory 填充的一些属性。

RemedialItem 的新视图中的损坏表单:

 <% using(Html.BeginForm("Create","RemedialItem",FormMethod.Post))
 {%>
 <%: Html.AntiForgeryToken() %>   
 <fieldset>      
   <legend>General</legend>      
   <div>
      <%: Html.LabelFor(m=>m.RemedialItem.Category) %>
      <%:Html.DropDownListFor(m=>m.RemedialItem.Category.Id, new  SelectList(Model.Categories,"Id","Name")) %>
   </div>
   <div>
      <%: Html.LabelFor(m=>m.RemedialItem.Item) %>
      <%: Html.TextAreaFor(m=>m.RemedialItem.Item) %>
   </div>
   <div>
      <%: Html.LabelFor(m=>m.RemedialItem.Note) %>
      <%: Html.TextAreaFor(m=>m.RemedialItem.Note) %>
   </div>
   <input type="submit" value="Create Item" />
 </fieldset>
 <%}%>  

一个有效的新视图:

<% using (Html.BeginForm("Create","Customer",FormMethod.Post)) {%>
    <%: Html.ValidationSummary(true) %>
    <%:Html.AntiForgeryToken() %>
    <fieldset>
        <legend>Fields</legend>
        <p>
        <%: Html.LabelFor(m=>m.Customer.Name) %>
        <%: Html.TextBoxFor(m=>m.Customer.Name) %>
        </p>
        <p>
        <%: Html.LabelFor(m=>m.Customer.Street) %>
        <%: Html.TextBoxFor(m=>m.Customer.Street) %>
        </p>
        [...tl;dr...]
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

两者都产生相似的字段名称:

破碎:

<label for="RemedialItem_Item">Item</label>
<textarea cols="20" id="RemedialItem_Item" name="RemedialItem.Item" rows="2">
</textarea>

工作:

<label for="Customer_Name">Name</label>
<input id="Customer_Name" name="Customer.Name" type="text" value="" />

对于代码转储过长,我深表歉意,简而言之: 工作集,当回传到创建表单时,ModelName 设置为Customer。破碎的东西是一个空字符串

我有什么遗漏吗?有没有人遇到过这样的事情?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    我发现了问题。在 ViewModel 中,保存要显示的RemedialItem 实例的属性称为RemedialItem。在它发布到的操作中,采用RemedialItem 实例的参数称为item,这破坏了一切。

    简而言之,在使用 ViewModels 时,请确保从 ViewModel 中获取对象的参数名称与 viewmodel 中的属性名称相同。

    我的日子就这样过去了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多