我想创建一个Master / Detail页面,该页面显示模型的属性以及作为集合的同一模型的属性项。页面本身应该只有一个保存按钮,用于将值存储在数据库中。我还想允许用户对页面上显示的集合属性进行更改,而不将它们保存到数据库中。下面的代码显示了图片集的设置,但我也希望为“子表/网格”(即“pocos”的集合)执行此操作。有没有办法在MVC中做到这一点?
根据我的理解,我必须保留对象的实例并将其传递到HTMLActions
之间,因为此实例包含所有更改。
只是在正确的方向上的一些指针会很好,或者,如果情况指出,MVC不应该用于此...
模特:
public class MasterModel : ModelBase
{
public MasterModel()
{
}
private int id;
public int Id
{
get { return id; }
set { id = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private ListBase<PicModel> pics;
public ListBase<PicModel> Pics
{
get { return pics; }
set { pics = value; }
}
}
控制器:
public ActionResult Edit(int id)
{
if (id <= 0 )
{
return RedirectToAction("Index");
}
m = new MasterModel (id);
return View(m);
}
[HttpPost]
public ActionResult NewPic(int id, HttpPostedFileBase uploadFile)
{
PicModel p = new PicModel();
MemoryStream ms = new MemoryStream();
uploadFile.InputStream.CopyTo(ms);
b.Picture= ms.ToArray();
m.Pics.Add(b); //Here it fails, as the MasterModel m is a different one then when the ActionResult Edit is called
}
查看:
@model app1.Models.MasterModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/index.js")" type="text/javascript"></script>
<script>
$("#PicForm").on("submit", function (e) {
e.preventDefault();
var form = $(this);
var formData = new FormData(form.get(0));
$.ajax({
url: form.attr("action"),
method: form.attr("method"),
data: formData,
processData: false,
contentType: false
})
});
</script>
<div class="col-md-4 col-lg-4">
@using (Html.BeginForm("NewPic", "MasterModel ", FormMethod.Post, new { id = "PicForm", enctype = "multipart/form-data" }))
{
@Html.HiddenFor(model => model.Id)
<div class="container-fluid">
@foreach (app1.Models.PicModel b in Model.Pics)
{
var base64 = Convert.ToBase64String(b.Picture);
var imgSrc = String.Format("data:image/gif;base64,{0}", base64);
<img src="@imgSrc" width="200" height="200" />
}
</div>
<div>
<input type="file" id="uploadFile" name="uploadFile" />
<input type="submit" value="uploadFile" class="submit" />
</div>
}
</div>
更新06.01.2018:
在MVC5中有效的方法是使用sessionString
。但是,我了解到这在asp.net Core中不起作用。
集:
m = (MasterModel )System.Web.HttpContext.Current.Session["sessionString"];
得到:
System.Web.HttpContext.Current.Session["sessionString"] = m;
答案 0 :(得分:1)
或者......,MVC不应该用于此...
Pure MVC不会削减它,你已经开始使用Ajax电话。
但是你会发现这变得越来越复杂。
最好的途径是研究SPA,例如Angular。
在MVC5中有效的方法是使用Session []。
是的,但那是服务器端的状态管理,横向扩展等问题 但是可用,对于ASP.NET Core,您可以使用MemoryCache,或者升级到ReDis。您仍然可以(可以配置)会话ID。
使用SPA,您不会需要缓存/会话,只需将其用于优化。
答案 1 :(得分:-1)
尝试使用TempData存储您的数据并访问下一个请求。