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
}
@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>
}
@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)
@*正确值*@
我不知道发生了什么事。在我看来像个虫子。有人知道吗?在执行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" />