我已根据本文ASP.NET MVC: Annotated for Input by Dino Esposito
创建了一个编辑器模板一切正常,直到我按下提交按钮。我发现我的POST函数返回模型是NULL,它就像模型没有绑定到视图一样。我一直在尝试我所知道的所有技巧,我从互联网上找到但我还是无法修复它。
这是我的控制器
// GET: /Asset/New
public ActionResult New()
{
ViewBag.typeID = new SelectList(db.Ref_Asset_Types, "ID", "name");
return View(new AssetViewModel());
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult New(AssetViewModel vm)
// vm.asset should contain new value but currently return null
{
if (ModelState.IsValid)
{
db.Assets.Add(vm.asset);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.typeID = new SelectList(db.Ref_Asset_Types, "ID", "name", vm.asset.typeID);
return View("New", vm);
}
这是我的观点
@using (Html.BeginForm("New","Asset","POST")) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.EditorFor(m=>m.asset, "InputTemplate" )
//注意:如果我不使用自己的模板,则代码可以运行==> @ Html.EditorFor(M => m.asset)
<div class="form-actions btn pull-right">
@Html.ActionLink("Back to List", "Index", null, new { @class = "btn btn-sm"})
<button type="reset" class="btn btn-sm" value="Index">
Reset
</button>
<button type="submit" class="btn btn-sm btn-success">
<i class="glyphicon glyphicon-plus"></i>
Tambah
</button>
</div>
}
这是我的InputTemplate
@inherits System.Web.Mvc.WebViewPage
@if (Model == null)
{
<span>@ViewData.ModelMetadata.NullDisplayText</span>
}
else
{
foreach (var prop in ViewData
.ModelMetadata
.Properties
.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm)))
{
if (prop.DisplayName != null) { // only display prop not of ComplexType
// note : using bootstrap for css styling
<div class="form-group col-xs-6">
<label class="col-xs-4 control-label text-right">
<span style="color:red"> @(prop.IsRequired ? "*" : "") </span>
<span>@prop.GetDisplayName()</span>
</label>
<div class="col-xs-8">
@if(prop.IsReadOnly)
{
<span class="readonly-field">@Html.Display(prop.PropertyName)</span>
}
else if (prop.TemplateHint == "DropDown")
{
<span>@Html.DropDownList(prop.PropertyName,(IEnumerable<SelectListItem>) ViewData[prop.PropertyName], new { @class = "form-control" })</span>
<span>@Html.ValidationMessage(prop.PropertyName)</span>
}
else
{
<div class="editor-field">
<span>@Html.Editor(prop.PropertyName, new { @class = "text-box single-line form-control" })</span>
<span>@Html.ValidationMessage(prop.PropertyName, new { @class = "label-danger" } )</span>
</div>
}
</div>
</div>
} // if
} // foreach
}
这是我的viewmodel
using System;
using SIGMA.Models;
namespace SIGMA.ViewModels
{
public class AssetViewModel
{
public AssetViewModel()
{
asset = new Asset();
}
public Asset asset { get; set; }
}
}
这是我的模特
public class Asset
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
[HiddenInput(DisplayValue = false)]
public int ID { get; set; }
[DisplayName("No. Siri")]
[StringLength(45)]
public string serial_num { get; set; }
[DisplayName("Model")]
[Required(ErrorMessage = "Model perlu diisi!")]
[StringLength(45)]
public string model { get; set; }
[DisplayName("Harga Seunit")]
[RegularExpression(@"^\d{0,6}(\.\d{2})?$", ErrorMessage = "Sila gunakan format harga yang betul.")]
public float? unit_cost { get; set; }
[UIHint("DropDown")]
[DisplayName("Jenis Aset")]
[Required(ErrorMessage = "Jenis aset perlu dipilih!")]
[DisplayFormat(NullDisplayText = "Belum didaftar")]
public int? typeID { get; set; }
public virtual Ref_Asset_Type type { get; set; }
}
答案 0 :(得分:1)
对不起家伙的麻烦..我想我解决了。
我最大的错误就是使用保留字&#39;模型&#39;和&#39;键入&#39;作为我的财产名称。这就是使用用户定义编辑器模板解释我的模型时asp.net的问题。
我将属性名称 - 模型更改为model_name并输入asset_type后,我可以在返回模型中看到我的条目。
感谢所有
....为这个愚蠢的错误花费了一整天的白天和黑夜,但教训是值得的