asp.net-mvc – MVC发布复杂对象的列表
|
我有一个FeedbackViewModel包含一个问题列表: public class FeedbackViewModel
{
public List<QuestionViewModel> Questions { get; set; }
}
这个QuestionViewModel是一个可以由5种不同类型的问题继承的对象 public class QuestionViewModel
{
public string QuestionText { get; set; }
public string QuestionType { get; set; }
}
一个继承问题类型的例子: public class SingleQuestionViewModel : QuestionViewModel
{
public string AnswerText { get; set; }
}
在控制器中的索引操作的HttpGet中,我从数据库中获取问题,并在FeedbackViewModel中的问题列表中添加正确的问题类型然后在视图中渲染此模型: @using (Html.BeginForm())
{
//foreach (var item in Model.Questions)
for (int i = 0; i < Model.Questions.Count; i++)
{
<div class="form-group">
@Html.DisplayFor(modelItem => Model.Questions[i].QuestionText,new { @class = "control-label col-md-4" })
<div class="col-md-6">
@if (Model.Questions[i].QuestionType == "Single")
{
@Html.EditorFor(modelItem => (Model.Questions[i] as OpenDataPortal.ViewModels.SingleQuestionViewModel).AnswerText)
}
else if (Model.Questions[i].QuestionType == "Multiple")
{
@Html.TextAreaFor(modelItem => (Model.Questions[i] as OpenDataPortal.ViewModels.SingleQuestionViewModel).AnswerText)
}
else if (Model.Questions[i].QuestionType == "SingleSelection")
{
@Html.RadioButtonForSelectList(modelItem => (Model.Questions[i] as OpenDataPortal.ViewModels.SingleSelectionQuestionViewModel).SelectedAnswer,(Model.Questions[i] as OpenDataPortal.ViewModels.SingleSelectionQuestionViewModel).SelectionAnswers)
}
else if (Model.Questions[i].QuestionType == "MultipleSelection")
{
@Html.CustomCheckBoxList((Model.Questions[i] as OpenDataPortal.ViewModels.MultipleSelectionQuestionViewModel).AvailableAnswers)
}
else if (Model.Questions[i].QuestionType == "UrlReferrer")
{
@Html.EditorFor(modelItem => (Model.Questions[i] as OpenDataPortal.ViewModels.SingleQuestionViewModel).AnswerText)
}
</div>
</div>
<br />
}
<br />
<button type="submit">Submit</button>
}
现在,我根本无法让它在模型中发布问题列表.是否可以发布不同对象类型的列表? 编辑:以下是我发现使用Fiddler的帖子中的数据列表: 解决方法经过多次研究,我发现了两个解决方案:一个是编写具有硬编码的Id和Name的HTML 感谢Phil Haack(@haacked)2008年博客文章http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/ 启发我的HTML片段: <form method="post" action="/Home/Create">
<input type="hidden" name="products.Index" value="cold" />
<input type="text" name="products[cold].Name" value="Beer" />
<input type="text" name="products[cold].Price" value="7.32" />
<input type="hidden" name="products.Index" value="123" />
<input type="text" name="products[123].Name" value="Chips" />
<input type="text" name="products[123].Price" value="2.23" />
<input type="submit" />
</form>
后阵列看起来有点像: products.Index=cold&products[cold].Name=Beer&products[cold].Price=7.32&products.Index=123&products[123].Name=Chips&products[123].Price=2.23 模型: public class CreditorViewModel
{
public CreditorViewModel()
{
this.Claims = new HashSet<CreditorClaimViewModel>();
}
[Key]
public int CreditorId { get; set; }
public string Comments { get; set; }
public ICollection<CreditorClaimViewModel> Claims { get; set; }
public CreditorClaimViewModel[] ClaimsArray {
get { return Claims.ToArray(); }
}
}
public class CreditorClaimViewModel
{
[Key]
public int CreditorClaimId { get; set; }
public string CreditorClaimType { get; set; }
[DisplayFormat(ApplyFormatInEditMode = true,DataFormatString = "{0:N2}")]
public Decimal ClaimedTotalAmount { get; set; }
}
控制器GET: public async Task<ActionResult> Edit(int id)
{
var testmodel = new CreditorViewModel
{
CreditorId = 1,Comments = "test",Claims = new HashSet<CreditorClaimViewModel>{
new CreditorClaimViewModel{ CreditorClaimId=1,CreditorClaimType="1",ClaimedTotalAmount=0.00M},new CreditorClaimViewModel{ CreditorClaimId=2,CreditorClaimType="2",}
};
return View(model);
}
Edit.cshtml: @Html.DisplayNameFor(m => m.Comments)
@Html.EditorFor(m => m.Comments)
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(m => Model.Claims.FirstOrDefault().CreditorClaimType)
</th>
<th>
@Html.DisplayNameFor(m => Model.Claims.FirstOrDefault().ClaimedTotalAmount)
</th>
</tr>
<!--Option One-->
@foreach (var item in Model.Claims)
{
var fieldPrefix = string.Format("{0}[{1}].","Claims",item.CreditorClaimId);
<tr>
<td>
@Html.DisplayFor(m => item.CreditorClaimType)
</td>
<td>
@Html.TextBox(fieldPrefix + "ClaimedTotalAmount",item.ClaimedTotalAmount.ToString("F"),new
{
@class = "text-box single-line",data_val = "true",data_val_number = "The field ClaimedTotalAmount must be a number.",data_val_required = "The ClaimedTotalAmount field is required."
})
@Html.Hidden(name: "Claims.index",value: item.CreditorClaimId,htmlAttributes: null)
@Html.Hidden(name: fieldPrefix + "CreditorClaimId",htmlAttributes: null)
</td>
</tr>
}
</table>
<!--Option Two-->
@for (var itemCnt = 0; itemCnt < Model.ClaimsArray.Count(); itemCnt++)
{
<tr>
<td></td>
<td>
@Html.TextBoxFor(m => Model.ClaimsArray[itemCnt].ClaimedTotalAmount)
@Html.HiddenFor(m => Model.ClaimsArray[itemCnt].CreditorClaimId)
</td></tr>
}
表单在控制器中处理: 邮政型号: public class CreditorPostViewModel
{
public int CreditorId { get; set; }
public string Comments { get; set; }
public ICollection<CreditorClaimPostViewModel> Claims { get; set; }
public CreditorClaimPostViewModel[] ClaimsArray { get; set; }
}
public class CreditorClaimPostViewModel
{
public int CreditorClaimId { get; set; }
public Decimal ClaimedTotalAmount { get; set; }
}
控制器: [HttpPost]
public ActionResult Edit(int id,CreditorPostViewModel creditorVm)
{
//... (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – ASP.NET MVC – ModelState.IsValid是false
- asp.net-mvc – ASP.NET MVC是否允许私有ViewModel构造函数
- asp.net – 带有MVC 4.0的DotNetOpenAuth
- ASP.NET MVC3 HttpStatusCodeResult StatusDescription –
- asp.net-mvc – 在REST Web API调用中返回复杂对象
- Asp.net webForm设置允许表单提交Html的方法
- asp.net-mvc – 使用自定义值呈现Html.Hidden帮助器
- asp.net – 如何防止Entity Framework将FileStream列加载到
- asp.net-mvc – asp.net mvc针对不同操作的不同验证规则
- asp.net – 直接将.aspx转换为.pdf [已关闭]
- asp.net – 从承载令牌(Web API)获取自定义声明值
- asp.net-mvc-4 – MVC 4 – 从视图中的Controlle
- asp.net – 如何以编程方式触发dropdownlist.sel
- 在asp.net发送简讯到大约10000封电子邮件
- asp.net – 在FormsAuthenticationTicket上的Ver
- asp.net-mvc-4 – IIS 7.5上的ASP.NET MVC 4,返回
- asp.net-core – JsonConvert DataSet .NET Core
- ASP.NET 5未在开发模式下运行
- asp.net-mvc – 用于Firefox的Windows认证网站提
- 用户锁定.net 4.5.1 ASP.NET MVC 5
