C# MVC模型绑定-在部分编辑期间维护值
我有一个模型课C# MVC模型绑定-在部分编辑期间维护值,c#,asp.net,asp.net-mvc,razor,http-post,C#,Asp.net,Asp.net Mvc,Razor,Http Post,我有一个模型课 public class Mod { public string StaticProp1 {get; set;} public string StaticProp2 {get; set;} public string EditableProp1 {get; set;} } 我想要一个可以编辑EditableProp1但显示StaticProp1,StaticProp2但不可编辑的视图 我创建了一个强类型视图: @model Mod @using (H
public class Mod
{
public string StaticProp1 {get; set;}
public string StaticProp2 {get; set;}
public string EditableProp1 {get; set;}
}
我想要一个可以编辑EditableProp1
但显示StaticProp1
,StaticProp2
但不可编辑的视图
我创建了一个强类型视图:
@model Mod
@using (Html.BeginForm())
{
<p>@Model.StaticProp1</p>
<p>@Model.StaticProp2</p>
@Html.TextBoxFor(m => m.EditableProp1)
<input type="submit" value="Save" />
}
如果我出于某种原因发回,这会导致一个问题,因为staticProp1现在将为null,视图将无法显示它
我知道我可以补充
@Html.HiddenFor(m => m.StaticProp1)
@Html.HiddenFor(m => m.StaticProp2)
在我看来,这将很好,但我想知道是否有其他更好的方法
我的值已在表单上(@Model.StaticProp1
)。有没有办法将模型绑定到不可编辑的标记上?有这样的HTML助手吗
顺便说一句,如果不是很明显,我只是从MVC开始,所以如果我完全没有抓住要点,请让我知道 要持久化的模型的每个属性都必须在表单中(在编辑器或隐藏字段中)。正如您所建议的,您可以使用
Html.HiddenFor()
进行此操作。如果要避免使用隐藏字段重载视图,可以仅在隐藏字段中存储实体的id,并根据Post
操作中的id获取其余数据。或者将Html.TextBoxFor()
与readonly
属性一起使用,请参阅以了解有关它的更多信息(我也喜欢第二个答案中的方法)。我认为问题更多地与模型绑定及其工作方式有关。如果您不想在这里使用隐藏字段(我认为这适合您的场景),您可以通过从以下继承类来自定义模型绑定:
DefaultModelBinder
如果
StaticProp
来自数据库或其他地方,您可以再次读取它们,并在回发方法中设置模型数据。为什么要避免HiddenFor?这是它的一个常见用例。我想避免它,因为其中有很多(我的模型比我在这里展示的更复杂)。只是感觉他们把视图弄得乱七八糟,既然这些值已经在表单上了,我想也许还有别的方法。类似@Html.LiteralFor(…)的东西您可以将@Html.TextBoxFor与自定义css类(删除文本框装饰)和readonly属性一起使用,这样它就无法更新或创建您自己的帮助程序,从而使其更干净。我相信禁用的属性将导致字段无法发布,这是当前他的问题。readonly属性就是他想要的。这很有道理,我认为readonly
属性确实是一个不错的选择。我添加了一个相关的问题。谢谢,这些方法很好用。我只是想确保我没有遗漏任何明显的事实。
DefaultModelBinder