2017-01-29 91 views
-1

我正在學習ASP.NET MVC 5.我創建了一個視圖「創建」。但我沒有使用Razor來生成輸入字段,我使用純html輸入。HttpPost後填充字段創建 - 對象爲空使用輸入

Create.cshtml

@model MyProject.Product 

<h2>Create Product</h2> 

<form method="post"> 

    Description: <br /> 
    <input type="text" name="Description" id="Description"/> <br /> 
    ValueType: <br /> 
    <input type="text" name="ValueType" id="ValueType"/> 
    <br /> 
    <input type="submit" name="btSend"/> 

</form> 

我的控制器:

public ActionResult Create() 
     {    
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Create(Product product) 
     { 
      if (ModelState.IsValid) 
      {     
       db.Product.Add(product);     
       db.SaveChanges();     
       return RedirectToAction("Index"); 

      } 
      else 
      { 
       return View(product); 
      } 

    It works fine. I can create new products. 

但我需要使用一些服務器端驗證與模型註解。 因此,我想發送數據,如果模型無效,請返回使用值創建。我知道如何把驗證信息。所以,我試過這個:

@model MyProject.Product 

<h2>Create Product</h2> 

<form method="post"> 

    Description: <br /> 
    <input type="text" name="Description" id="Description" value="@Model.Description"/> <br /> 
    ValueType: <br /> 
    <input type="text" name="ValueType" id="ValueType" value="@Model.ValueType"/> 
    <br /> 
    <input type="submit" name="btSend"/> 

</form> 

如何將純輸入與html綁定到模型?

爲什麼爲空值?

非常感謝。

+1

爲什麼在世界上你不使用剃刀?使用@ Html.LabelFor()','@ Html.TextBoxFor()'和@ Html.ValidationMessageFor()'生成你正確的控件形式,然後查看它生成的所有html,並將它與你的比較,這意味着你沒有雙向模型綁定,也沒有驗證 –

+0

因爲我和前端開發人員一起工作,他們給了我創建的html。我想知道是否有辦法處理輸入類型。如何綁定它? – ComplexityAlg

+0

使用'HtmlHelper'方法將爲您提供正確的html,這對於雙向模型綁定和驗證是必需的。 '@ Model.Description'是剃鬚刀代碼,所以毫無疑問你不想使用剃鬚刀 –

回答

0

如果您不想使用razor based form approach,則可以使用顯示驗證消息和Viewbag/ViewData

[HttpPost] 
    public ActionResult Create(Product product) 
    { 
     if (!ModelState.IsValid) 
     { 
      //if you want to get validation message from ModelState itself, you can query from Modelstate : 
      string message = string.Join(" , ", ModelState.Values 
           .SelectMany(v => v.Errors) 
           .Select(e => e.ErrorMessage)); 
      ViewData["ValidationMessage"] = "Validation Message";// you can use above variable message here 
      return View(product); 
     } 
    // your other implementation 
    } 

你的觀點應該是這樣的:

@model MyProject.Product 

<h2>Create Product</h2> 

<form method="post"> 
    <div class="error-message">@ViewData["ValidationMessage"]</div> 
    Description: <br /> 
    <input type="text" name="Description" id="Description" value="@Model.Description"/> <br /> 
    ValueType: <br /> 
    <input type="text" name="ValueType" id="ValueType" value="@Model.ValueType"/> 
    <br /> 
    <input type="submit" name="btSend"/> 

</form> 

不過,我會建議使用razor based form approach如果你允許這樣做。

+0

你的解決方案**是使用剃鬚刀(這就是@ViewData [「ValidationMessage」]中的@意思是 –

+0

是的,但OP已經在使用一些簡單的剃鬚刀,比如「@Mode.Description」和「@Model.ValueType」 –

+0

是的,我知道(正如我在問題的評論中指出的那樣)。但是你的問題說明了如果你不喜歡不想使用剃鬚刀,但使用剃鬚刀顯示解決方案: –