C# mvc开始表单无法使路由覆盖工作
simnilar回答了这个问题 我有一个视图模型,该视图包含用于填充下拉列表和列表的集合。所以我不想返回它们,我只想返回模型对象。实际上,我只想在该模型中返回4个字段,但这是下一个问题。 我以前通过做这个appraoch来回避这个问题,但是除非我提交整个viewmodel,否则我就没有运气了。在这个表单上,95%的信息都被丢弃了,这太荒谬了 无论如何,我在这里遇到的问题是,我无法将createpost中返回的游戏事件设置为null以外的任何内容。创建时的gameEvent参数为NULL 我也有点惊讶,我没能找到这方面的大量信息 控制员:C# mvc开始表单无法使路由覆盖工作,c#,asp.net-mvc,C#,Asp.net Mvc,simnilar回答了这个问题 我有一个视图模型,该视图包含用于填充下拉列表和列表的集合。所以我不想返回它们,我只想返回模型对象。实际上,我只想在该模型中返回4个字段,但这是下一个问题。 我以前通过做这个appraoch来回避这个问题,但是除非我提交整个viewmodel,否则我就没有运气了。在这个表单上,95%的信息都被丢弃了,这太荒谬了 无论如何,我在这里遇到的问题是,我无法将createpost中返回的游戏事件设置为null以外的任何内容。创建时的gameEvent参数为NULL 我也有
public ActionResult Create()
{
...
var createEventViewModel = new CreateEventViewModel()
{
Places = places,
Characters = characters,
Event = new GameEvent()
};
return this.View(createEventViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Name,Description,EventType,Duration")] GameEvent gameEvent)
{
...
}
观点:
@model Sisyphus.Web.Models.CreateEventViewModel
@{
ViewBag.Title = "Create Event";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Create Event</h2>
<div class="row">
<div class="col-lg-8">
<section id="createEvent">
@using (Html.BeginForm("Create", "Event",
new
{
GameEvent = Model.Event
}, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.Event.Name, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Event.Name, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Event.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Event.Description, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextAreaFor(m => m.Event.Description, 10, 30, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Event.Description, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Event.Duration, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Event.Duration, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Event.Duration, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Event.EventType, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EnumDropDownListFor(m => m.Event.EventType)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create Event" class="btn btn-default" />
</div>
</div>
}
</section>
</div>
</div>
向下编辑的viewmodel已删除不相关的成员
public class CreateEventViewModel
{
public GameEvent Event { get; set; }
}
编辑:
好的,我刚试过这个
@using (Html.BeginForm("Create", "Event",
new RouteValueDictionary()
{
{"GameEvent", Model.Event}
}, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
游戏事件现在不为空(其中的所有值都为空)-因此实际上不存在任何更接近的情况例如,回发的输入基于
类CreateEventViewModel
@Html.TextBoxFor(m => m.Event.Name, ...
@Html.TextAreaFor(m => m.Event.Description, ...
这将生成以下html
<input id="Event_Name" name="Event.Name" value=....
您还应该从Html.BeginForm`方法中删除new{GameEvent=Model.Event}
注意:我排除了BindAttibute,因为我认为在这种情况下没有必要使用它-您似乎需要GameEvent的所有属性,并且除非您为位置
和字符
的属性创建输入,否则它们无论如何都将为空,并且由于您没有访问其他属性,因此没有批量分配vulner能力
另一种选择是手动创建输入,以便正确映射属性,或者直接映射到html
<input name="Name" value=@Model.Event.Name />
<input name="Description" value=@Model.Event.Desciption />
您是如何创建输入的?@Html.TextBoxFor(m=>m.GameEvent.Name)将生成然后我将编辑以包含该代码…1秒很有趣,可能会解决另一个问题(让我做我真正想做的事情)…我如何命名参数,以便它可以自动绑定到输入“GameEvent.Name”如上所述?我说这是我不想做的。我想返回viewmodel的模型部分,而不是viewmodel。我实际上只想从模型中返回4个字段,而不是整个字段(在这里编辑,但正如我上面所说,这是我的下一个问题)有一个覆盖似乎可以实现我想要的功能—我在问如何实现这一功能。在许多情况下,您不想返回整个viewmodel,因为您只需要它的一小部分数据。但是,您给了我一个想法,因为您只回发了事件的属性,这就是您将得到的全部内容(其他所有内容均为null)。但另一种方法是手动创建绑定的输入名称,例如var Name=Model.Event.Name;@Html.TextBoxFor(m=>Name,…
生成此语句,除非我提交整个viewmodel,该表单上95%的信息被丢弃,这是荒谬的。严格来说,这不是真的。只有输入和选择被发回。如果您使用@Html.DisplayFor()
或手动创建其他属性的显示元素,它们不会被发回var名称技巧不起作用-没有显示文本框。其他信息非常有用,谢谢。我仍然想知道如何将viewmodel的部分绑定到任意命名的参数。我更喜欢显式连接。我在这一点上,我发现了这个:但也不能让它工作…但不能让它在mvc5中工作。尽管如此,仍然在玩它
public ActionResult Create(CreateEventViewModel model)
{
GameEvent event = model.GameEvent;
// do whatever with GameEvent
<input name="Name" value=@Model.Event.Name />
<input name="Description" value=@Model.Event.Desciption />
var Description = Model.Event.Description;
@Html.TextBoxFor(m => Description)