我是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>
答案 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,包含以下代码:
<input type="text" class="form-control">
&#13;
当您调用Html.EditorFor帮助程序时,默认情况下它会创建一个标记,其中包含所有相关标记:
<input data-val="true" id="StartPoint" name="StartPoint" type="text" value="" />
&#13;
但是,由于覆盖默认字符串编辑器,标签不再正确呈现。
&#39;名称&#39;属性帮助MVC将控制值映射到相关的类属性,所以当我定义自己的模板时,我从来没有给MVC知道哪些值属于哪个模型属性。