如何在MVC操作之间传递模型项

时间:2017-12-27 17:18:43

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

我想创建一个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;

2 个答案:

答案 0 :(得分:1)

  

或者......,MVC不应该用于此...

Pure MVC不会削减它,你已经开始使用Ajax电话。
但是你会发现这变得越来越复杂。

最好的途径是研究SPA,例如Angular。

  

在MVC5中有效的方法是使用Session []。

是的,但那是服务器端的状态管理,横向扩展等问题 但是可用,对于ASP.NET Core,您可以使用MemoryCache,或者升级到ReDis。您仍然可以(可以配置)会话ID。

使用SPA,您不会需要缓存/会话,只需将其用于优化。

答案 1 :(得分:-1)

尝试使用TempData存储您的数据并访问下一个请求。