我正在使用ASP.NET MVC 3.我有一个问题是否有可能更新模型,即使它没有被发送到控制器?也许问题是完全的,或者我是以错误的方式做事?
我对控制器方法进行了ajax调用。我正在传递身份证。我希望控制器在db中找到一些东西,然后更新模型,将其传递回视图。
我有一个非常大的模型......我找到了一些解决方案,将模型转换为javascript对象,并将其发送到控制器。这是唯一/正确的方式吗?
How to send a model in jQuery $.ajax() post request to MVC controller method
我认为控制器可能有模型,我可以更新其中的某些字段吗?
对控制器的调用:
function getBis(id) {
$.ajax({
type: "GET",
url: '@Url.Action("GetBis")',
data: { "id": id },
dataType: 'json',
cache: false,
success: function (data) {
// Do something here
},
error: function (jqXHR, textStatus, errorThrown) {
alert("Problem!");
}
});
}
控制器代码:
public ActionResult GetBis(string id)
{
BeslutIStortDTO viewModel = new BeslutIStortDTO();
int theId;
if (!Int32.TryParse(id, out theId))
throw new Exception("Wrong id");
viewModel = _blLayer.GetBIS(theId);
// somehow update the model here!
return View("index", viewModel);
}
答案 0 :(得分:0)
通常你在JQuery和你的控制器之间“传递模型”,当你需要“反映”UI上的更改而不进行任何映射时(MVC足够聪明,可以从你给它的参数构造一个新对象) 。在你的情况下,你说你只需要传递一个ID来做你的模型上的一些东西。因此,您需要做的就是将ID作为参数传递,在控制器操作中获取它,然后执行您的操作。
查看以下链接
答案 1 :(得分:0)
首先更新模型,您的意思是要更新数据库中的记录吗?在get请求中这不是一个好习惯。如果没有阅读..
使用GetBis方法获取对象后,可以更改其所有属性。
如果要将此对象发送到Javascript,请使用JSON Result。
return JSON(viewModel);
还有一件事,不要在第一行代码中初始化视图模型,不必要的对象分配。
答案 2 :(得分:0)
简短的回答是“是”和“否”,具体取决于您的意思,但您可能需要重新考虑您的设计。我猜你实际上是在尝试将域实体呈现给你的视图,而不是视图模型。这是一个常见的新手错误。
我想澄清的一点是域实体和视图模型之间的区别。
通常从持久层中提取域实体,这是应该进行状态更改的位置。
视图模型是临时构造,在服务器上创建,就在视图以HTML格式输出之前,用作View模板的数据仓库。在请求之后,它在客户端的Web浏览器上不存在,并且在请求后它不再存在于服务器上。
如果您使用Ajax执行某种类型的数据更改,而不是重新加载页面,那么您通常会做的是更改Domain对象(通过Id),而不是您最初传入的View Model (不再存在)。
例如。
我有一个与数据库记录绑定的域实体。 Person {long id = 1; string name = bob; bool enabled = true}
我有一个视图模型(我在初始的get控制器函数中映射到bob) PersonData {long id = 1; string name =“bob”,enabled = true}
为此,在我的初始页面GET控制器功能中,我从数据库中提取域实体bob,将其数据复制到视图模型的实例,然后将视图模型传递给View(“EditPerson”) ,pd)动作结果,它通过剃刀视图页面和视图模型,并在适当的时候将值替换为写入响应流的HTML。
现在,您在客户端的Web浏览器上拥有HTML,即IT。没有视图模型。现在你有一些Ajax是浏览器端脚本,例如当我点击“切换状态”链接时,会发生什么是浏览器(不更改页面)将向你提供的ajax url提交请求,传入鲍勃的身份。然后,您的控制器功能应加载Bob的实体版本,并将启用的Bob的实体版本切换为适当的值,然后将该更改保留到数据库。
最初的VIEW模型无处可去,因为自从初始页面呈现给浏览器以来它一直不存在。
你有没有想要完成的具体事情,你无法看到这种模式的方法?