gpt4 book ai didi

c# - ASP.NET MVC 2.0 - ViewModel 中的数据在发布后丢失

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:28 24 4
gpt4 key购买 nike

我有一个名为 ProductController 的 Controller 。 Controller 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Services.Abstract;
using Web.Models;
using Ninject;
using Services.Entities;

namespace Web.Controllers
{
public class ProductController : Controller
{

IProductRepository productRepository;

public ProductController(IProductRepository products)
{
productRepository = products;
}


[HttpGet]
public ActionResult Create() {

Product p = new Product {
Id = 5
};

string theTitle = "The Title";

var viewModel = new ProductViewModel {
Product = p,
TheTitle = theTitle
};

return View(viewModel);

}

[HttpPost]
public ActionResult Create(ProductViewModel pvm) {

if (ModelState.IsValid) {
int result = productRepository.SaveProduct(pvm.Product);
return Content(result.ToString());
}
else {
return View(pvm);
}

}

}
}

我正在使用 ViewModel 模式将各种信息发送到 View 。例如,我正在发送一个默认 ID 设置为 5 的产品,并且我还设置了一个标题属性 [另外:这不是生产代码 - 只是测试数据:-)]

到目前为止一切都很好。第一次调用/Product/Create时,我的Title属性显示在 View 上,Product Id默认为5。但是,当我发布表单时,只保留了Product信息。如果 ModelState 无效,我会再次向用户显示 View 。但是,这一次,标题不显示(它被设置为空)。不过,该产品确实按预期显示。

如果可能,我想在 ModelState 无效时将原始标题发送回 View 。有没有什么方法可以不使用 Session、ViewData 和 TempData 来做到这一点?

此致,并提前致谢

最佳答案

如果我没理解错的话,简短的回答是“不”。

如果 ProductViewModel.TheTitle 属性不是发布到 Create POST 方法的表单数据的一部分,您将不得不以某种方式重新创建它。您正在寻找可以跨多个请求保留此值的可能方法,但我想问一下是否真的有必要最终去那里。

在我看来,如果您在 Create GET 方法中检索 Title 属性的方式对于这些请求来说足够好,那么在 POST 请求中以相同的方式重新创建它也同样足够好。 POST 通常会花费更多的资源和时间来处理(验证、保存数据等),因此您将自己暴露在额外的依赖项和漏洞中,以进行可能微不足道的优化。也就是说,我确信在很多情况下您的做法都是合理的。

在您的示例中,由于 Title 属性未用于保存产品并且可以有效地忽略,如果您仍然希望在这些页面中保留它而不重新创建它,最简单的方法可能是将它包含在隐藏的表单字段,以便您的模型 Binder 除了产品之外还可以拾取它。请注意,如果最终用户操纵表单有效负载,他们可能会更改此值。

关于c# - ASP.NET MVC 2.0 - ViewModel 中的数据在发布后丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3239095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com