编辑器模板返回null值

时间:2014-12-14 23:18:26

标签: asp.net asp.net-mvc

我已根据本文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; }
    }

1 个答案:

答案 0 :(得分:1)

对不起家伙的麻烦..我想我解决了。

我最大的错误就是使用保留字&#39;模型&#39;和&#39;键入&#39;作为我的财产名称。这就是使用用户定义编辑器模板解释我的模型时asp.net的问题。

我将属性名称 - 模型更改为model_name并输入asset_type后,我可以在返回模型中看到我的条目。

感谢所有

....为这个愚蠢的错误花费了一整天的白天和黑夜,但教训是值得的