【问题标题】:Casting (int)enum to a object property does not get passed when called by razor view model剃刀视图模型调用时,将 (int) 枚举转换为对象属性不会被传递
【发布时间】:2023-04-07 08:02:01
【问题描述】:

使用 MVC 5 和 Razor 页面。

场景是当我将 (int)colour 转换为名为 Color 的 Item 属性时,该属性在我的 HttpGet 方法中属于 INT 类型。这个值应该被传递给 ViewModel,我把它作为一个隐藏字段存储在 razor 视图上。

所以在调试我的代码时:

返回视图(视图模型); viewModel.Colour = 23 - 正确

这将显示 Razor 视图,在这个 razor 视图中我将 model.House 值存储到隐藏字段中,因此我可以执行 HttpPost。

在这个阶段,我的原始 URL 是: applicationName/Orange/Item/Create?date=2014-08-05&_1236723545

请注意,url 中的 Color 参数中有 Orange,还有一个位于末尾的模型,它有一个 Color 属性,其编号为 23。

现在,一旦 iv 完成填写表格并按保存,ModelState 在此阶段无效,因为在剃刀视图中出于某种奇怪的原因 @Html.HiddenFor(model => model.Colour) 存储字符串值“Orange”而不是模型提供的 23。现在我明白了 URL 和我的对象模型中的名称冲突,但这肯定会起作用。

我的路线配置

routes.MapRoute(
    name: "Item",
    url: "{colour}/{controller}/{action}/{id}",
    defaults: new { controller = "Item", action = "Index", id = UrlParameter.Optional }
);

我的 Get 方法:

[HttpGet]
public ActionResult Create(Colour colour, DateTime? date)
{
    var viewModel = new Item()
    {
        ItemDate = (!date.HasValue ? DateTime.Now.Date : date.Value),
        Colour = (int) colour,
        ItemTypeId = 1
    };

    return View(viewModel);
}

我的发帖方式

[HttpPost]
public ActionResult Create(Item item)
{
    if (ModelState.IsValid)
    {
        _itemService.Create(item);
        return RedirectToAction("Index", "Item", new { date = item.itemDate.ToString("yyyy-MM-dd") });
    }
    return View(item);
}

所以我的问题是如何让我的剃刀视图忽略写在 url 中的颜色并使用作为 Item 属性的颜色。所以应该是 23 而不是“橙色”。

谁能给点建议?

【问题讨论】:

  • 表单使用发布的数据和 URL 值的组合。有一个重复的名字不是一个好主意。你可以重命名你的路线参数,例如到col,因为该名称并不重要(只要您在路由/链接中匹配它)?
  • @TrueBlueAussie 谢谢,是的,我更改了路由参数名称,因为这是导致问题的原因,但是由于项目相当大,因此需要在链接中的其他位置进行更改,所以我找到了替代解决方案,因为我相信绑定导致了这个问题,所以在我的 Post 方法中我添加了 [Bind(Exclude = "Colour")],这已经解决了这个问题,而没有对项目的其他部分进行修改。不确定这是否是正确的方法,但会继续寻找。

标签: c# asp.net-mvc asp.net-mvc-4 razor enums


【解决方案1】:

明确排除它是一个好方法:

public ActionResult YourMethod([Bind(Exclude = "Colour")] Item item{

    //Implementation

}

另一种选择是显式包含您要绑定到的请求中的所有参数:

public  ActionResult YourMethod([Bind(Include = "NotColour1, NotColour2")] Item item{

    //Implementation

} 

我更喜欢这种方法,因为

  1. Visual Studio 在搭建东西时会以这种方式存根(这不是技术上充分的理由,但已经足够好了)
  2. 在安全方面让我更有信心,因为您说的是什么是,而不是什么是不可能的,因此我觉得控制力更强。

不过,我同意这个建议,您应该考虑为不相关的事物选择不同的名称(或者至少将它们放在不同的命名空间中?)

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2012-11-03
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多