模型数据未通过表单传播到控制器ASP.NET MVC4

时间:2015-04-04 17:28:40

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

我是ASP.NET MVC框架的新手,并且通过一门课程让自己快速掌握它。在这样做的过程中,我正在开展一个涵盖所有重要内容的项目,现在我遇到了问题:

我设置了一个页面,只是向客户端显示一些html内容,然后如果用户希望参与,他们可以单击一个按钮来显示一个表单,然后他们可以使用这些表单填写一些所需的数据。以下是用于显示相应标记的javascript:

<script>
$(document).ready(function(){
$("#btnOneWayTrip").click(function () {
    $("#TripFromPlaceHoler").show();
});

$("#TripFromPlaceHoler").hide();
});

在'TripFromPlaceHoler'div中,我只是在其中放置一个表单,表单的标记如下所示:

@using (Html.BeginForm("CreateOneWayTrip","Trips")) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>TestTripClass</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.TripID)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.TripID)
        @Html.ValidationMessageFor(model => model.TripID)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.StartPoint)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.StartPoint)
        @Html.ValidationMessageFor(model => model.StartPoint)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.EndPoint)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.EndPoint)
        @Html.ValidationMessageFor(model => model.EndPoint)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.StartTime)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.StartTime)
        @Html.ValidationMessageFor(model => model.StartTime)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

我的控制器看起来像这样:

public class TripsController : Controller
{
    //
    // GET: /Trip/

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

    [HttpPost]
    public ActionResult CreateOneWayTrip(Models.TestTripClass model)
    {
        //Do something with model here


        return Redirect("~/Trips/Index");
    }
}

这是我的测试模型,有几次提到:

public class TestTripClass
{
    public string TripID { get; set; }
    public string StartPoint { get; set; }
    public string EndPoint { get; set; }
    public DateTime StartTime { get; set; }

}

当我填写表单并按下提交按钮时,我调试并检查我的'CreateOneWayTrip'ActionResult的参数时,只返回一个空白模型,称为'model'(如上面的代码所示)。为什么会这样?由于我是MVC的新手,请随意分享任何建议。

概述,这是我的.cshtml文件中的代码:

@model TransNex.Models.TestTripClass
@{
    ViewBag.Title = "Index";
}

<div class="row">
    <div class="col-lg-6" id="TripFromPlaceHoler">

        @using (Html.BeginForm("CreateOneWayTrip", "Trips"))
        {

            <fieldset>
                <legend>Create One Way Trip</legend>

                <div class="editor-label">
                    @Html.LabelFor(model => model.TripID)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.TripID)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.StartPoint)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.StartPoint)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.EndPoint)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.EndPoint)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.StartTime)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.StartTime)
                </div>

                <p>
                    <input type="submit" value="Create" />
                </p>
            </fieldset>
        }
    </div>
</div>

<script>
$(document).ready(function(){
    $("#btnOneWayTrip").click(function () {
        $("#TripFromPlaceHoler").show();
    });

    $("#TripFromPlaceHoler").hide();
});

</script>

3 个答案:

答案 0 :(得分:0)

ASP.NET MVC模型绑定器在反序列化复杂类型方面不是很好。 你可以用不同的方式做到这一点: 一种方法是在表单上有一个隐藏元素,其中包含模型中mising属性的名称。 另一种方法是采用与复杂模型绑定相关的可用方法之一,为此,请查看这些页面以进行复杂的模型绑定: http://erraticdev.blogspot.ca/2010/12/sending-complex-json-objects-to-aspnet.html How to post an array of complex objects with JSON, jQuery to ASP.NET MVC Controller?

答案 1 :(得分:0)

问题是从部分视图创建视图。如果您在直接根页面上移动htmls(不带部分),则提交按钮将填充您的模型类。

答案 2 :(得分:0)

我明白了。一段时间后,由自己的编辑器模板定义字符串值(通过在共享&#39;文件夹下创建&#39; EditorTemplates&#39;文件夹。该模板名为String.cshml,包含以下代码:

&#13;
&#13;
<input type="text" class="form-control">
&#13;
&#13;
&#13;

当您调用Html.EditorFor帮助程序时,默认情况下它会创建一个标记,其中包含所有相关标记:

&#13;
&#13;
<input data-val="true" id="StartPoint" name="StartPoint" type="text" value="" />
&#13;
&#13;
&#13;

但是,由于覆盖默认字符串编辑器,标签不再正确呈现。

&#39;名称&#39;属性帮助MVC将控制值映射到相关的类属性,所以当我定义自己的模板时,我从来没有给MVC知道哪些值属于哪个模型属性。