Asp.net mvc 如何使用视图模型作为控制器方法属性更新特定数据库条目
我在我的网站上有一个连接到视图模型的输入表。在controller方法中,我将此视图模型传递给controller,反之亦然,这意味着controller使用数据库中的数据填充视图模型,并且视图返回一个填充了用户可能输入的表单数据的视图模型 问题在于,一旦视图接收到视图模型对象,来自数据库的“ID”属性就不再存在了。调用Post方法时,无法知道必须更新哪个数据库条目 我的问题是:当我将视图模型传递给控制器方法时,如何更新特定的数据库条目 控制器方法示例:Asp.net mvc 如何使用视图模型作为控制器方法属性更新特定数据库条目,asp.net-mvc,database,entity-framework,linq,asp.net-mvc-viewmodel,Asp.net Mvc,Database,Entity Framework,Linq,Asp.net Mvc Viewmodel,我在我的网站上有一个连接到视图模型的输入表。在controller方法中,我将此视图模型传递给controller,反之亦然,这意味着controller使用数据库中的数据填充视图模型,并且视图返回一个填充了用户可能输入的表单数据的视图模型 问题在于,一旦视图接收到视图模型对象,来自数据库的“ID”属性就不再存在了。调用Post方法时,无法知道必须更新哪个数据库条目 我的问题是:当我将视图模型传递给控制器方法时,如何更新特定的数据库条目 控制器方法示例: [HttpPost] public Ac
[HttpPost]
public ActionResult method(ViewModel vm)
{
DataContext.Context.Where(x => x.ID == vm.Object.ID) // this is where vm.Object.ID always returns "0", not the actual ID from the database entry
Context.SaveChanges();
return View(vm);
}
如果你需要更多的信息,请告诉我。另外,对于这个项目来说,使用jquery不是一个可行的选择。非常感谢你的帮助
编辑:
视图:
@model MyANTon.ViewModels.Q4\u Answer\u VM
@{
ViewBag.Title=“myANTon Anforderungserfassung”;
ViewBag.HideNavBar=false;
}
@使用(Html.BeginForm())
{
编号。
最后
奎尔
齐尔
频率[h]
节选[m]
@{int i=1;}
@对于(var a=0;aModel.Matrix[a].Load)
@Html.TextAreaFor(x=>Model.Matrix[a].Source)
@Html.TextAreaFor(x=>Model.Matrix[a].Goal)
@Html.TextAreaFor(x=>Model.Matrix[a].Frequency)
@Html.TextAreaFor(x=>Model.Matrix[a].Distance)
}
}
获取方法:
[HttpGet]
public ActionResult Q_FourthPage()
{
// get current Questionnaire ID
int CurrentQstID = Convert.ToInt32(Session["qstid"]);
// create vm object. Capacity is a column in the table.
var Q4ViewModel = new ViewModels.Q4_Answer_VM();
// look for existing input data columns for this questionnaire in db
if (db.Capacities.Any(x => x.Questionnaire_ID == CurrentQstID))
{
// answers exist
Q4ViewModel.Matrix.AddRange(db.Capacities.Where(x => x.Questionnaire_ID == CurrentQstID));
}
else
{
// new capacity matrix
Q4ViewModel.TMatrix = db.QuestionTexts.Where(x => x.ID == 21).FirstOrDefault();
Q4ViewModel.Matrix = new List<Models.Capacity>();
}
var tmpcapacity = new Models.Capacity();
tmpcapacity.Questionnaire_ID = Convert.ToInt32(Session["qstid"]);
Q4ViewModel.Matrix.Add(tmpcapacity);
db.Capacities.Add(tmpcapacity);
db.SaveChanges();
return View(Q4ViewModel);
}
[HttpGet]
公共行动结果Q_第四页()
{
//获取当前问卷ID
int CurrentQstID=Convert.ToInt32(会话[“qstid]”);
//创建vm对象。容量是表中的一列。
var Q4ViewModel=newviewmodels.Q4_Answer_VM();
//在数据库中查找此问卷的现有输入数据列
if(db.capacity.Any(x=>x.ID==CurrentQstID))
{
//答案是存在的
Q4ViewModel.Matrix.AddRange(db.capacity.Where(x=>x.ID==CurrentQstID));
}
其他的
{
//新容量矩阵
Q4ViewModel.TMatrix=db.QuestionText.Where(x=>x.ID==21.FirstOrDefault();
Q4ViewModel.Matrix=新列表();
}
var tmpcapacity=新型号。容量();
tmpcapacity.inventory_ID=Convert.ToInt32(会话[“qstid”);
Q4ViewModel.Matrix.Add(tmpcapacity);
数据库容量。添加(TMP容量);
db.SaveChanges();
返回视图(Q4ViewModel);
}
张贴方法:
[HttpPost]
public ActionResult Q_FourthPage(ViewModels.Q4_Answer_VM vm)
{
int currentQst = Convert.ToInt32(Session["qstid"]);
if (Request.Form["+"] != null)
{
var tmpcapacity = new Models.Capacity();
tmpcapacity.Questionnaire_ID = currentQst;
vm.Matrix.Add(tmpcapacity);
db.Capacities.Add(tmpcapacity);
db.SaveChanges();
return View(vm);
}
if (Request.Form["Speichern"] != null)
{
// save data
if (!ModelState.IsValid) return View("~/Views/Shared/Error.cshtml");
var tmpcapacity = new Models.Capacity();
for (var a = 0; a < vm.Matrix.Count; a++)
{
var current = vm.Matrix[a];
current.ID = vm.Matrix[a].ID;
if (db.Capacities.Any(x => x.ID == current.ID))
// if clause never triggers true
// vm does not contain capacity ID
{
// column exists and is changed (or not)
tmpcapacity.Distance = vm.Matrix[a].Distance;
tmpcapacity.Frequency = vm.Matrix[a].Frequency;
tmpcapacity.Source = vm.Matrix[a].Source;
tmpcapacity.Goal = vm.Matrix[a].Goal;
tmpcapacity.Load = vm.Matrix[a].Load;
Models.Capacity c = db.Capacities.Where(x => x.ID == current.ID).FirstOrDefault();
c = tmpcapacity;
db.SaveChanges();
}
else
{
// new column
tmpcapacity.Distance = vm.Matrix[a].Distance;
tmpcapacity.Frequency = vm.Matrix[a].Frequency;
tmpcapacity.Source = vm.Matrix[a].Source;
tmpcapacity.Goal = vm.Matrix[a].Goal;
tmpcapacity.Load = vm.Matrix[a].Load;
tmpcapacity.Questionnaire_ID = currentQst;
db.Capacities.Add(tmpcapacity);
db.SaveChanges();
}
}
db.SaveChanges();
}
return View(vm);
}
[HttpPost]
公共行动结果第四页(ViewModels.Q4\u Answer\u VM)
{
int currentQst=Convert.ToInt32(会话[“qstid”]);
if(Request.Form[“+”]!=null)
{
var tmpcapacity=新型号。容量();
tmpcapacity.inventory_ID=currentQst;
vm.Matrix.Add(tmpcapacity);
数据库容量。添加(TMP容量);
db.SaveChanges();
返回视图(vm);
}
if(Request.Form[“speichen”]!=null)
{
//保存数据
如果(!ModelState.IsValid)返回视图(“~/Views/Shared/Error.cshtml”);
var tmpcapacity=新型号。容量();
对于(var a=0;ax.ID==current.ID))
//if子句从不触发true
//vm不包含容量ID
{
//列存在且已更改(或未更改)
tmpcapacity.Distance=vm.Matrix[a]。距离;
tmpcapacity.Frequency=vm.Matrix[a]。频率;
tmpcapacity.Source=vm.Matrix[a].Source;
tmpcapacity.Goal=vm.Matrix[a].Goal;
tmpcapacity.Load=vm.Matrix[a].Load;
Models.Capacity c=db.Capacity.Where(x=>x.ID==current.ID).FirstOrDefault();
c=TMP能力;
db.SaveChanges();
}
其他的
{
//新专栏
tmpcapacity.Distance=vm.Matrix[a]。距离;
tmpcapacity.Frequency=vm.Matrix[a]。频率;
tmpcapacity.Source=vm.Matrix[a].Source;
tmpcapacity.Goal=vm.Matrix[a].Goal;
tmpcapacity.Load=vm.Matrix[a].Load;
tmpcapacity.inventory_ID=currentQst;
数据库容量。添加(TMP容量);
db.SaveChanges();
}
}
db.SaveChanges();
}
返回视图(vm);
}
如果要“保存”对象ID并在post发生时将其取回,则需要将其存储到
[HttpPost]
public ActionResult Q_FourthPage(ViewModels.Q4_Answer_VM vm)
{
int currentQst = Convert.ToInt32(Session["qstid"]);
if (Request.Form["+"] != null)
{
var tmpcapacity = new Models.Capacity();
tmpcapacity.Questionnaire_ID = currentQst;
vm.Matrix.Add(tmpcapacity);
db.Capacities.Add(tmpcapacity);
db.SaveChanges();
return View(vm);
}
if (Request.Form["Speichern"] != null)
{
// save data
if (!ModelState.IsValid) return View("~/Views/Shared/Error.cshtml");
var tmpcapacity = new Models.Capacity();
for (var a = 0; a < vm.Matrix.Count; a++)
{
var current = vm.Matrix[a];
current.ID = vm.Matrix[a].ID;
if (db.Capacities.Any(x => x.ID == current.ID))
// if clause never triggers true
// vm does not contain capacity ID
{
// column exists and is changed (or not)
tmpcapacity.Distance = vm.Matrix[a].Distance;
tmpcapacity.Frequency = vm.Matrix[a].Frequency;
tmpcapacity.Source = vm.Matrix[a].Source;
tmpcapacity.Goal = vm.Matrix[a].Goal;
tmpcapacity.Load = vm.Matrix[a].Load;
Models.Capacity c = db.Capacities.Where(x => x.ID == current.ID).FirstOrDefault();
c = tmpcapacity;
db.SaveChanges();
}
else
{
// new column
tmpcapacity.Distance = vm.Matrix[a].Distance;
tmpcapacity.Frequency = vm.Matrix[a].Frequency;
tmpcapacity.Source = vm.Matrix[a].Source;
tmpcapacity.Goal = vm.Matrix[a].Goal;
tmpcapacity.Load = vm.Matrix[a].Load;
tmpcapacity.Questionnaire_ID = currentQst;
db.Capacities.Add(tmpcapacity);
db.SaveChanges();
}
}
db.SaveChanges();
}
return View(vm);
}
@using (Html.BeginForm())
{
@Html.HiddenFor(m => m.Object.Id);
<div class="container">
<div class="jumbotron">
@using (Html.BeginForm("method", "ControllerName", FormMethod.Post))
{
@Html.HiddenFor(Model=>Model.ID)
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="Button" />
</div>
</div>
}