0

我要创建的是一个显示模型属性的视图,以及更改 1 个属性的选项,在这种情况下,我为其创建了一个助手的“状态”。

我已经到了正确修改和更改更改的属性的地步,但是现在正在重置其他属性的值。

我猜这是因为发布数据用于修改模型,并且由于某些属性是不可更改的,所以我猜想使用空值来更新模型?

这是我的控制器 GET:

public ActionResult Edit(int id = 0)
    {
        ProductCode productcode = db.ProductCodes.Find(id);
        if (productcode == null)
        {
            return HttpNotFound();
        }
        return View(productcode);
    }

这里是POST:

[HttpPost]
    public ActionResult Edit(ProductCode productcode)
    {
        if (ModelState.IsValid)
        {
            db.Entry(productcode).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(productcode);
    }

最后是视图:

@model PortalTMC.Models.ProductCode

@{
     ViewBag.Title = "Change status";
}

<h2>Status veranderen</h2>
<br />

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
         <legend>ProductCode</legend>

        @Html.HiddenFor(model => model.Id)


        @Html.LabelFor(model => model.Id, "Id")
        @Html.DisplayFor(m => m.Id)
        @Html.LabelFor(model => model.Code, "Product code")
        @Html.DisplayFor(m => m.Code)
        @Html.LabelFor(model => model.Role, "Rol  (1 = Administrator  |  2 = Trainer  |  3 = User)")
        @Html.DisplayFor(m => m.Role)
        <div class="editor-label">
            @Html.LabelFor(model => model.Status, "Status")
        </div>
        <div class="editor-field">
            @Html.EnumDropDownListFor(model => model.Status)
        </div>
        <p>
        <input type="submit" value="Verander status" />
    </p>
</fieldset>
}

<div>
@Html.ActionLink("Terug naar lijst", "Index")
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

任何帮助将非常感激

更新:

不幸的是,在 post 方法中包含或排除属性不起作用:/例如,如果我将 post 方法替换为:

[AcceptVerbs(HttpVerbs.Post)]
    [HttpPost]
    public ActionResult Edit([Bind(Exclude = "Role, Code")] ProductCode productcode)
    {
        if (ModelState.IsValid)
        {
            db.Entry(productcode).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(productcode);
    }

我仍然以重置角色和代码结束..

产品代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace PortalTMC.Models
{
    public class ProductCode
    {
        //PK
        [Key]
        public int Id { get; set; }

        public string Code { get; set; }
        public ProductCodeStatus Status { get; set; }
        public int Role { get; set; }
    }

    public enum ProductCodeStatus
    {
        Active,
        Inactive,
        Pending,
    }
}
4

2 回答 2

1

vtortola 的建议非常有效,您不应该将实体直接暴露在视图中。我只会解释为什么实体的值即使在使用之后也会被重置ExcludeAttribute。事实上,它们并没有被重置。模型绑定器创建一个填充有默认值的新对象,然后将请求中的值写入该对象。在这里使用ExcludeAttribute不会有任何效果,因为它只是忽略了从请求参数中排除的值。但它仍然是一个新对象(不是来自 db 的对象)。因此,如果您希望模型绑定对象中出现不可编辑的值,则需要在请求对象中提供这些值(隐藏字段是一种选择)。

第二种选择是您从方法中省略绑定对象并通过方法显式调用模型绑定,UpdateModel例如

[AcceptVerbs(HttpVerbs.Post)]
    [HttpPost]
    public ActionResult Edit()
    {
        var code = db.GetCode();
        if (ModelState.IsValid)
        {

            UpdateModel(code, "Excluded properties as string seperated by comma");//plz check the correct overload of updatemodel
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    return View(code);
}
于 2012-12-05T15:13:41.097 回答
0

您可以使用ExcludeAttribute从绑定中排除属性。

但绝对不要通过 MVC 公开数据实体。创建表示浏览器和服务器之间的信息交换的输入/输出模型,以便您对该信息进行细粒度控制,如果它有效,则获取数据实体并应用值。

干杯。

于 2012-12-05T12:38:56.930 回答