2017-07-03 15 views
0

我有簡單的輸入表單(基本上用於反饋)和以下字段: 姓名,性別,手機號碼,投訴文本。 (爲了簡化我不提任何POST操作或提交表單上的按鈕)c#mvc表單:如何利用html.editorfor的好處來構建簡單反饋表單的視圖?

目前,我已經創建了以下MVC結構:

public class ComplaintController 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     return View(); //This view displays the complaint form with all above fields 
    } 
} 

我讀this和幾個他們建議使用等環節@ Html.EditorFor,因爲它基於模型數據類型創建UI。

目前,我沒有將任何模型傳遞給[HttpGet]視圖。如果我想使用@ Html.EditorFor,我需要將我的模型傳遞給[HttpGet]索引視圖,我該怎麼做?創建這種MVC表單最好的辦法是什麼?

+0

如果你只是想輸出用戶提交的內容,那麼在MVC中有很多方法可以做,如果你想在保存字段的新視圖中的確認消息,在你的db.SaveChanges之後,你可以做一個返回RedirectToAction(「ComfirmationView」,yourModel),然後將其傳遞給一個ActionResult Comfirmation(YourModel yourModel) – Henry24

+0

我認爲你有點混淆,我將這個問題改寫。刪除了所有不必要的細節。請檢查 – maverick

+0

您應該使用'@model YourModel',您將此代碼添加到視圖的頂部,或者當您添加視圖時,有一個選項可以創建強類型視圖,選中此選項並在模型類下選擇您的模型類。 [閱讀更多](https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/older-versions/mvc-music-store/mvc-music-store-part-3) – Munzer

回答

1

控制器:

public ActionResult Index() 
    { 
     whateverModel d = new whateverModel(); 
     return View(d); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Index(whateverModel m) 
    { 

     if (ModelState.IsValid) 
     { 

      //its valid, update your database or do soemthing useful here 
      return RedirectToAction("Success"); 
     } 
     //its not valid reload the page and let data annotations show the error 
     return View(m); 
    } 

一旦你在控制器代碼,那麼你可以有Visual Studio中自動創建視圖。在您的控制器中,右鍵單擊「d」返回View(d);並選擇「添加視圖」。將模板更改爲「創建」和Model類到您的模型(在本例中爲whateverModel)。它會自動爲您導入生成的chtml頁面,導入的模型和已經爲您生成的編輯器。下面的示例自動生成視圖。你可以在造型等方面工作。

CSHTML:

@model YourSolution.Models.whateverModel 

    @{ 
     ViewBag.Title = "Whatever"; 
     Layout = "~/Views/Shared/_Layout.cshtml"; 
    } 

    <h2>Whatever</h2> 

    @using (Html.BeginForm()) 
    { 
     @Html.AntiForgeryToken() 

     <div class="form-horizontal"> 
      <h4>Whatever</h4> 
      <hr /> 
      @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
      <div class="form-group"> 
       @Html.LabelFor(model => model.FriendlyName, htmlAttributes: new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        @Html.EditorFor(model => model.FriendlyName, new { htmlAttributes = new { @class = "form-control" } }) 
        @Html.ValidationMessageFor(model => model.FriendlyName, "", new { @class = "text-danger" }) 
       </div> 
      </div> 

      <div class="form-group"> 
       @Html.LabelFor(model => model.Order, htmlAttributes: new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        @Html.EditorFor(model => model.Order, new { htmlAttributes = new { @class = "form-control" } }) 
        @Html.ValidationMessageFor(model => model.Order, "", new { @class = "text-danger" }) 
       </div> 
      </div> 

      <div class="form-group"> 
       <div class="col-md-offset-2 col-md-10"> 
        <input type="submit" value="Create" class="btn btn-default" /> 
       </div> 
      </div> 
     </div> 
    } 

    <div> 
     @Html.ActionLink("Back to List", "Index") 
    </div> 
+0

這有助於,但建議練習在httpget中初始化這些空白對象,就像在「View(d);」中所做的那樣。這將有助於自動創建視圖,但否則這是不必要的內存分配,因爲此模型永遠不會被使用? – maverick

+0

由於不可空類型,建議練習。讓我們忽略大多數人在模型初始構造函數中爲屬性設置一些值的事實。比方說,爲了簡單起見,您有一個客戶模型,其中包含您用作數據庫中的主鍵的int custID。在視圖中,您不想顯示custID,因此您將其設置爲隱藏字段。繼續並在你的http get中初始化模型,並在提交時觀察它流向你的帖子THEN刪除初始化並觀察當你點擊「if(ModelState.IsValid)」行時在帖子中發生了什麼。 –

+0

這並不是說你不能對此進行編程來真正優化你的內存利用率,你只需要弄清楚它是否值得,因爲小的簡單對象根本不佔用太多的內存,大型的複雜對象將最可能會讓你在構造函數中初始化一些屬性,只是爲了正常的業務邏輯。我想我所說的只是意識到。 –

1

目前,我不傳遞任何模型到[HTTPGET]視圖。如果我想要 使用@ Html.EditorFor,我需要將我的模型傳遞給[HttpGet]索引 查看,我該怎麼做?

薩赫勒您好,作爲第一步驟,創建一個模型類像下面

public class FeedBack 
{ 
    public string Name{get;set;} 
    public string Gender{get;set;} 
    public int Mobile-Number{get;set;} 
    public string Complaint{get;set;} 

    // other additional fields 


} 

而在控制器get方法,通過一個模型如下面

public class ComplaintController 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     FeedBack OBJFeedback = new FeedBack();  
     return View(OBJFeedback); 
    } 
} 

而在一個視圖,強烈鍵入此模型並將數據發佈到控制器發佈方法。

這裏是強類型的視圖的例子:http://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/strongly-typed-views-in-mvc/

重要提示:在取得動作的方法,因爲你不希望在視圖中默認顯示的任何值,即使你不通過模型對象時,它會以同樣的方式工作。

希望以上資料是有用的

感謝

KARTHIK

+0

這會有所幫助,但是建議您在httpget中初始化這些空白對象,就像您在「查看(OBJFeedback)」中所做的那樣。這將有助於自動創建視圖,但否則這是不必要的內存分配,因爲此模型永遠不會被使用? – maverick

+0

是的,你是完全正確的,這有助於自動創建視圖,否則這是一個不必要的內存分配。所以不要在httpget中創建模型對象。感謝karthik –

+0

太好了,但是如何在沒有任何模型的情況下利用Html.Editorfor的功能?任何其他出路? – maverick

0

如果你想使用@ Html.EditorFor,那麼肥大傳遞模型到view.What做@ Html.EditorFor做?這使得像

<input class="text-box single-line" id="Name" name="Name" type="text" value=""> 

html標籤所以,如果你不想對模型傳遞給視圖,那麼你需要寫原始的HTML標籤像上面。保持html標籤的名稱屬性與mvc的模型屬性相同是很重要的,因爲當您要將數據發佈到控制器時,html標籤的name屬性將映射mvc模型屬性並在Controller方法中獲取相應的值。

在視圖(somthing.cshtml)中,您可以使用html標籤,因爲.cshtml ==。cs + html。所以整個代碼看起來象

控制器方法

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



[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult FeedBack(FeedBackModel Model) 
{ 
    var feedBack = Model; 
    return View(); 
} 

和視圖

<form action="/Home/FeedBack" method="post" id="feedBackForm"> 
    @Html.AntiForgeryToken() 
    <hr> 
    <div class="form-group"> 
     <div class="col-md-5"> 
      <label for="Name">Name</label> 
     </div> 
     <div class="col-md-5"> 
      <input class="text-box single-line" name="Name" type="text"> 
     </div> 
     </div> 
    <div class="form-group"> 
     <div class="col-md-5"> 
      <label for="Name">Gender</label> 
     </div> 
     <div class="col-md-5"> 
      <select name="Gender"> 
       <option value="male">Male</option> 
       <option value="female">Female</option> 
      </select> 
     </div> 
     </div> 
    <div class="form-group"> 
     <div class="col-md-5"> 
      <label for="Name">MobileNumber</label> 
     </div> 
     <div class="col-md-5"> 
      <input class="text-box single-line" name="MobileNumber" type="text"> 
     </div> 
     </div> 
    <div class="form-group"> 
     <div class="col-md-5"> 
      <label for="Name">Complaint</label> 
     </div> 
     <div class="col-md-5"> 
      <textarea class="text-box single-line" name="Complaint"></textarea> 
     </div> 
     </div> 


    <div class="col-md-5"> 
     <input type="submit" value="Create" class="btn btn-default"> 
    </div> 
</form> 

如果你不想使用提交,那麼你可以使用Ajax。