首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UpdateModel不工作(MVC)

UpdateModel不工作(MVC)
EN

Stack Overflow用户
提问于 2014-05-02 02:57:24
回答 2查看 1.2K关注 0票数 0

我一直在关注书呆子晚餐教程。我在它的基础上创建了自己的项目,但我在让UpdateModel工作时遇到了麻烦。它看起来相当复杂,所以我将在下面尽可能详细地解释它。

在ServersController.cs中:

代码语言:javascript
复制
public ActionResult Create(FormCollection formValues)
{
    Server server = new Server();

    try
    {
        UpdateModel(server);  <----- This is not working

        // server.Name = "testAdd";
        // server.OS = "2008 R2";

        serverRepository.Add(server);
        serverRepository.Save();

        return RedirectToAction("Details", new { id = server.ServerID });
     }
     catch
     {
     **not important**
     }

如果我尝试使用UpdateModel(服务器),任何东西都不会保存到数据库表中。但是,如果我注释掉该行,并在设置server.Name和server.OS的代码中使用注释行,则会将其保存到表中。但是,正在发布的任何其他表单输入都不会保存。

例如,如果我像上面的代码一样显式地设置server.Name和server.OS,但随后通过窗体设置其他属性,如LastBackedUp和server.OS,则从窗体设置的任何属性都不会保存到数据库表中,当页面重定向时,它们也不会反映在“详细信息”视图中。

下面是同样用ServersController.cs编写的"Details“GET方法的代码:

代码语言:javascript
复制
public ActionResult Details(int id)
{
    Server server = serverRepository.GetServer(id);
    RackInfo rackInfo = rackRepository.GetRack(id);

    if (server == null)
        return View("NotFound");
    else
        return View(new ServerDetailViewModel(rackInfo, server));
}

基本上,在创建并保存新服务器之后,应该加载上面的"Detail“视图,该视图使用"ServerDetailViewModel”类生成一些数据以传递给视图。

下面是ServerDetailViewModel()代码:

代码语言:javascript
复制
public class ServerDetailViewModel
{
    public RackInfo RackInfo { get; private set; }
    public Server Server { get; private set; }
    public string Name { get; private set; }

    public ServerDetailViewModel(RackInfo rackInfo, Server server)
    {
         Server = server;
         RackInfo = rackInfo;

         *more code here that sets stuff*
    }
}

我认为我的问题与表单参数的传递方式有关。

我可以在一些服务器属性中显式编写代码,然后将这些属性保存到数据库表中,这似乎很奇怪。但是,当我尝试使用UpdateModel做任何事情时,似乎什么也做不到。当我使用UpdateModel时,它会将我重定向到详细信息页面,但我为属性输入的值似乎都没有出现。此外,我通过表单输入的属性都不会保存到数据库表中。

如果你们中的任何人看过书呆子晚餐教程(http://weblogs.asp.net/scottgu/archive/2009/04/28/free-asp-net-mvc-nerddinner-tutorial-now-in-html.aspx),那就是我一直在使用的。当我完成了大约一半,我决定开始一个新的项目,实现我正在使用的东西。

我最初能够让Create工作,但在向控制器添加了另一个单独的存储库之后,create方法中断了..

任何关于这方面的意见或见解都将不胜感激。如果您需要任何其他信息,请告诉我。

谢谢S.O.!!

编辑(包括“创建”表单):

代码语言:javascript
复制
@model PACSSL.Models.ServerFormViewModel

@using (Html.BeginForm())

{ @Html.AntiForgeryToken()

代码语言:javascript
复制
<div class="form-horizontal">
    <h4>Server</h4>
    <hr />
    @Html.ValidationSummary(true)

    <div class="form-group">
        @Html.LabelFor(model => model.Server.Name, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.Name)
            @Html.ValidationMessageFor(model => model.Server.Name)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Domain, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(x => x.Domain, Model.Domain)
            @Html.ValidationMessageFor(model => model.Domain)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.BackedUp, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(x => x.BackedUp, Model.BackedUp)
            @Html.ValidationMessageFor(model => model.BackedUp)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.Role, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.Role)
            @Html.ValidationMessageFor(model => model.Server.Role)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.GroupOwner, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.GroupOwner)
            @Html.ValidationMessageFor(model => model.Server.GroupOwner)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.PatchNotes, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.PatchNotes)
            @Html.ValidationMessageFor(model => model.Server.PatchNotes)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.LastPatched, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.LastPatched) Format: yyyy-mm-dd
            @Html.ValidationMessageFor(model => model.Server.LastPatched)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.PatchedBy, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(x => x.PatchedBy, Model.PatchedBy)
            @Html.ValidationMessageFor(model => model.PatchedBy)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.VP, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(x => x.VP, Model.VP)
            @Html.ValidationMessageFor(model => model.VP)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.VMHost, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.VMHost)
            @Html.ValidationMessageFor(model => model.Server.VMHost)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.Location, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.Location)
            @Html.ValidationMessageFor(model => model.Server.Location)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.PurchaseDate, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.PurchaseDate) Format: yyyy-mm-dd
            @Html.ValidationMessageFor(model => model.Server.PurchaseDate)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.OS, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.OS)
            @Html.ValidationMessageFor(model => model.Server.OS)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.Model, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.Model)
            @Html.ValidationMessageFor(model => model.Server.Model)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.DellST, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.DellST)
            @Html.ValidationMessageFor(model => model.Server.DellST)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.ServiceContract, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.ServiceContract) Format: yyyy-mm-dd
            @Html.ValidationMessageFor(model => model.Server.ServiceContract)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Server.IsLive, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Server.IsLive)
            @Html.ValidationMessageFor(model => model.Server.IsLive)
        </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>

}

EN

回答 2

Stack Overflow用户

发布于 2014-05-02 03:13:44

这是你的问题所在。

当您使用表达式名称生成表单字段时,您会生成一个具有‘model => model.Server.OS’属性的字段,如下所示:

代码语言:javascript
复制
"Server.OS"

然后,当您尝试将其绑定到模型时,它将绑定到与表达式"Server.OS“匹配的模型属性-因此,如果您的模型对象是server,它将绑定到以下内容:

代码语言:javascript
复制
server.Server.OS

我想,当你想要绑定到server.OS时。我的建议是扁平化你的视图模型,这样你就有了Model.OS而不是Model.Server.OS。然后当你这么做的时候。

代码语言:javascript
复制
UpdateModel(server);

..。它应该将"OS“字段绑定到"OS”属性。

简而言之:与server对象相比,视图模型具有额外的属性嵌套级别,因此生成的字段名称和您试图绑定到的属性不匹配。

更好的是,通过修改您的控制器操作来绑定回相同的视图模型,使其具有签名:

代码语言:javascript
复制
public ActionResult Create(ServerDetailViewModel model)

然后在控制器(或一些静态映射类)中手动进行映射-视图模型和域模型应该完全独立。

票数 1
EN

Stack Overflow用户

发布于 2014-05-02 03:18:23

您正在尝试更新“空”模型。它是空的,因为您正在创建一个新实例。

代码语言:javascript
复制
  Server server = new Server();

try
{
    //At this point you have an empty model because you just 
    //created a new Instance of your Server class,
    //It is updating the Model with all Null values because they aren't assigned to anything
    UpdateModel(server);  <----- This is not working


     //Here you assign values to your model, hence why they are not null anymore 
     // Your other values aren't getting saved because they still don't have a value.         
     server.Name = "testAdd";
     server.OS = "2008 R2";

    serverRepository.Add(server);
    serverRepository.Save();

    return RedirectToAction("Details", new { id = server.ServerID });
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23414572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档