这主要是对本期评论的后续评论,但我没有足够的声誉评论......
假设我有一个简单的模型:
public class SimpleClass
{
public String Label { get; set; }
public String FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
标签是基于用户/客户端更改的,因此它不能是DataAttribute.如果发布回发处理问题时,我们需要重绘整个页面.这是前一篇文章的关键问题.接受的解决方案是这样做:
@Html.DisplayTextFor(model => model.Label)
@Html.HiddenFor(model => model.Label)
@Html.EditorFor(model => model.FirstName)
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为它有效.但是我们的模型更加复杂和广泛.这种方法会导致大量的隐藏字段,这似乎是一个非常肮脏的解决方案.
这让我想到JP的评论:
解决方案是重新加载模型.但它不仅仅是重新加载,它也是一种合并,因为您希望保留任何客户端数据更改.
default: SimpleClass { Label="TheLabel", FirstName="Rob"}
postedback: SimpleClass { Label="", FirstName="Steve" }
we want: SimpleClass { Label="TheLabel", "FirstName="Steve" }
Run Code Online (Sandbox Code Playgroud)
我的问题是MVC有一个很好的方法来知道哪些字段被回发,所以它正确合并?我们只需要合并回传字段而不是空白属性.
或者只是更好地整理回发而不是表单提交?这样可以避免提交时出现所有模型重新加载问题.
为了给予Pablo信用,我接受了他的解决方案.要查看我的解决方案的简单示例,请在下面的答案中查看Robert Harvey的评论:
我确信这在其他地方有所涉及,但我遇到了一些问题,想出一个优雅的解决方案.
ID C D
1 Apple Red
1 Pear Orange
2 Apple Red
2 Pear Orange
Run Code Online (Sandbox Code Playgroud)
我想要最终得到的是:
ID | Benefit | Value
1 | C | Apple
1 | C | Pear
2 | C | Apple
2 | C | Pear
1 | D | Red
1 | D | Orange
2 | D | Red
2 | D | Orange
Run Code Online (Sandbox Code Playgroud)
我可以在Linq中扫描每一列并添加到列表中.
public class SampleRow
{
public Int32 Id { get; set; }
public String A { get; set; …
Run Code Online (Sandbox Code Playgroud)