C# mvc开始表单无法使路由覆盖工作

C# mvc开始表单无法使路由覆盖工作,c#,asp.net-mvc,C#,Asp.net Mvc,simnilar回答了这个问题 我有一个视图模型,该视图包含用于填充下拉列表和列表的集合。所以我不想返回它们,我只想返回模型对象。实际上,我只想在该模型中返回4个字段,但这是下一个问题。 我以前通过做这个appraoch来回避这个问题,但是除非我提交整个viewmodel,否则我就没有运气了。在这个表单上,95%的信息都被丢弃了,这太荒谬了 无论如何,我在这里遇到的问题是,我无法将createpost中返回的游戏事件设置为null以外的任何内容。创建时的gameEvent参数为NULL 我也有

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)