Razor 使用HTML扩展的值与两个模型具有相同名称的属性时的值不同

Razor 使用HTML扩展的值与两个模型具有相同名称的属性时的值不同,razor,properties,asp.net-mvc-4,htmlextensions,Razor,Properties,Asp.net Mvc 4,Htmlextensions,这是我的设想 创建了两个具有公共属性名称的模型 public class SimpleModel1 { // Some Properties public string Property1 { get; set; } } public class SimpleModel2 { // Some Properties public string Property1 { get; set; } // Same name as Property1 in SimpleModel1 } 在返回

这是我的设想

  • 创建了两个具有公共属性名称的模型

    public class SimpleModel1
    {
    // Some Properties
    
    public string Property1 { get; set; }
    
    }
    
    public class SimpleModel2
    {
    // Some Properties
    
    public string Property1 { get; set; } // Same name as Property1 in SimpleModel1
    
    }
    
  • 在返回如下视图的操作(例如索引)中使用SimpleModel1

    @model MvcApplication2.Models.SimpleModel1
    
    @{
    ViewBag.Title = "Home Page";
    }
    
    @using (Html.BeginForm("Test", "Home", FormMethod.Post))
    {
      <label>Enter something here</label>
       @Html.TextBoxFor(m => m.Property1)
       <button type="submit">Submit</button>
    }
    
  • Test.cshtml(测试操作返回的视图)如下所示:

    @model MvcApplication2.Models.SimpleModel2
    
    @{
        ViewBag.Title = "Test";
    }
    
    <h2>Test</h2>
    
     @* Model Propery without using HTML extension*@
     @Model.Property1
    
     @* Model property using HTML extension (Incorrect) *@
    
     @Html.TextBoxFor(m => m.Property1)
     @Html.HiddenFor(m => m.Property1)
     @Html.TextAreaFor(m => m.Property1)
    
      @* Correct Value *@
     <input value="@Model.Property1" />
    
    @model mvcapapplication2.Models.SimpleModel2
    @{
    ViewBag.Title=“测试”;
    }
    试验
    @*不使用HTML扩展的模型属性*@
    @型号1.不动产1
    @*使用HTML扩展名的模型属性(不正确)*@
    @Html.TextBoxFor(m=>m.Property1)
    @Html.HiddenFor(m=>m.Property1)
    @Html.TextAreaFor(m=>m.Property1)
    @*正确值*@
    
  • 我所期望的是,Property1的所有值都将是测试操作中设置的“与模型的Property1不同的东西”。但事实证明,使用Html扩展名(Html.TextBoxFor、Html.HiddenFor等)的程序具有发布到测试操作的Property1值。例如,如果我发布“What a惊喜”(SimpleModel1的属性1)来测试操作,则SimpleModel2的属性1的值也是“What a惊喜”,无论我将其设置为什么


    我不知道发生了什么事。在我看来像个虫子。有人知道吗?

    在执行POST时,您会看到这种行为,因为发布的数据是持久化在ModelState中的。Property1的值将是为该属性发布的任何值。 为了查看您的新值,您需要在ActionResult测试中包含这行代码:

    ModelState.Clear();
    

    作为一般规则,请记住在发布数据、修改数据并尝试在返回的视图中查看修改后的数据时包含这一行。

    这是可行的,但为什么html扩展方法会出现问题?@Model.Property1如何显示正确的值?内部html扩展方法查看ModelState中的值以确定属性的值。这就是它们的写法。我说不出为什么它们是这样写的。希望其他人可以。我也很想知道。@Dmitry如果您有一个post方法,它不是采用ViewModel,而是单独采用几个参数,或者使用表单集合检索值,那么在验证失败的post上,您不必构建一个新的viewmodel,也不必从表单元素中设置所有不同的属性,因为表单将从ModelState自动填充。对于在POST参数中使用ViewModel的其他人来说,MODESTATE优先于view模型成为了一件麻烦事。这不是为他们的设计辩护,而是从我所读到的来看,这是它的预期目的。
    @model MvcApplication2.Models.SimpleModel2
    
    @{
        ViewBag.Title = "Test";
    }
    
    <h2>Test</h2>
    
     @* Model Propery without using HTML extension*@
     @Model.Property1
    
     @* Model property using HTML extension (Incorrect) *@
    
     @Html.TextBoxFor(m => m.Property1)
     @Html.HiddenFor(m => m.Property1)
     @Html.TextAreaFor(m => m.Property1)
    
      @* Correct Value *@
     <input value="@Model.Property1" />