c#mvc form:如何利用html.editorfor的优势构建简单反馈表的视图?

时间:2017-07-03 19:25:54

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我有简单的输入表单(主要用于反馈),包含以下字段: 姓名,性别,手机号码,投诉文本。 (为了简化我没有在表格上提及任何POST动作或提交按钮)

目前,我创建了以下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] Index View,我该怎么做?什么是创建此类MVC表单的最佳实践?

3 个答案:

答案 0 :(得分: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"作为回报查看(d);并选择"添加视图。"将模板更改为"创建"和Model的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>

答案 1 :(得分:1)

  

目前,我没有将任何模型传递给[HttpGet]视图。如果我想   要使用@ Html.EditorFor,我需要将我的模型传递给[HttpGet]索引   查看,我该怎么做?

嗨sahil,作为第一步,创建一个类似下面的模型类

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/

重要说明:在get action方法中,由于您不希望在视图中默认显示任何值,即使您没有传递模型对象,它也会以相同的方式工作。

希望以上信息有用

由于

KARTHIK

答案 2 :(得分:0)

如果你想使用@ Html.EditorFor,那么你就把模型传递给视图。@ Html.EditorFor做什么?它使html标签像

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

因此,如果您不想将模型传递给视图,那么您需要编写如上所述的原始html标记。保持html标签的name属性与mvc的model属性相同是很重要的,因为当你想将数据发布到控制器时,html标签的name属性将映射mvc model属性并在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。