Asp.net mvc MVC 5和复杂类型列表
我已经检查了以及其他一些关于这个主题的帖子 我还是宁愿问这个问题,为了理解而不是简单地复制粘贴答案 我有一个复杂类型,如下所示:Asp.net mvc MVC 5和复杂类型列表,asp.net-mvc,list,model-binding,Asp.net Mvc,List,Model Binding,我已经检查了以及其他一些关于这个主题的帖子 我还是宁愿问这个问题,为了理解而不是简单地复制粘贴答案 我有一个复杂类型,如下所示: public interface ICaracteristic { int value { get; set; } int max { get; set; } string name { get; set; } } public class BaseAttributes : ICaracteristic { public int m
public interface ICaracteristic
{
int value { get; set; }
int max { get; set; }
string name { get; set; }
}
public class BaseAttributes : ICaracteristic
{
public int max { get; set; }
public int value { get; set; }
public string name { get; set; }
Random r = new Random();
}
以及使用这些类型的倍数列表的对象:
public class Character
{
// Infos
public string characterName { get; set; }
public string playerName { get; set; }
public IGame game { get; set; }
// Caracteristics
public List<ICaracteristic> baseAttr { get; set; }
public List<ICaracteristic> skills { get; set; }
public List<ICaracteristic> stats { get; set; }
public List<ICaracteristic> spendPoints { get; set; }
}
这显然失败了,因为名称为“null”
我只在“基本属性”部分将“foreach”更改为“for”。在该部分中,所有名称都设置为null。在其他部分中,不取任何值
有什么想法吗 既然Stephen Muecke不在乎名声: --不能将模型绑定到接口 --因为modelbinder需要索引,所以不能对列表执行foreach --您需要对每个要使用的值进行“控制”排序,因此对于复杂类型,甚至在显示名称上也需要一个 一个好的解决方案是执行for循环,在该循环中,除了@Html.DisplayFor之外,还包括一个@Html.Hiddenfor,以便显示名称不可编辑,但仍有一个控件。
对于接口和modelbinder缺乏交互,唯一的解决方案是使用接口的实现。遗憾的是。您无法绑定到接口(
DefaultModelBinder
无法初始化接口实例)。您需要一个for
循环(或自定义EditorTemplate
)-一个foreach
循环将不起作用-请参阅。您可以创建一个自定义的ModelBinder
来处理接口,但是您还需要发布一些值来指示要使用的具体实现initialize@StephenMuecke因此,如果我将角色模型中的“List baseAttr”替换为“List baseAttr”,它应该可以工作?是的,只要您使用for
循环(或者对于BaseAttributes
类型的自定义EditorTempate
,并在主视图中使用@Html.EditorFor(m=>m.baseAttr)
所以我必须在我使用接口的每个地方强式键入,并在for循环中更改foreach。好吧,这对接口来说有点糟糕:-/我试试这个。@StephenMuecke好吧,我试着用它的实现替换接口的每一次出现:的确,表单采用了ICaracteristic的值,但它不采用它的名称a纽约(--')。你知道是什么引起的吗?
@model RPGmvc.Models.Character
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<h4>Character @Html.TextBoxFor(model => model.characterName)</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="row">
<!--SECTION BASE ATTRIBUTES-->
<div class="col-md-3">
<!-- @foreach (var item in Model.baseAttr)
{
<div>
<label>@Html.DisplayFor(model => item.name)</label>
<p>@Html.EditorFor(model => item.value, new { @class = "form-control" })</p>
</div>
}
@model RPGmvc.Models.Caracteristic.ICaracteristic
<p>
@Html.DisplayFor(m => m.name)
@Html.DisplayFor(m => m.value)
</p>
foreach (ICaracteristic battr in myCharac.baseAttr)
{
var currentNode = myDoc.SelectSingleNode("/character_sheet/base_attributes/" + battr.name.Replace(" ", "_").ToLower());
currentNode.InnerText = battr.value.ToString();
}