将模型传递给所有视图 mvc

Passing Model to all views mvc

主要是出于练习原因,我正在尝试使用 mvc 编写网页。
当页面加载时读取一个 xml 文件并创建一个包含一些设置的商店模型。

<Store>
    <StoreId>459</StoreId>
       <StoreSettings>
          <path1>c:\mobile\</path1>
          <path2>c:\mobile2\</path2>
     </StoreSettings>
  </Store>
  <Store>
    <StoreId>150</StoreId>
       <StoreSettings>
          <path1>c:\mobile\</path1>
          <path2>c:\mobile2\</path2>
     </StoreSettings>
  </Store>
</ArrayOfStore>

用户从下拉列表中选择他想要的商店(因此他选择将发生的操作的设置)表单回发,我从列表中获取 selected 值并创建具体型号。

我正在寻找将特定模型转移到所有其他视图的好方法。
我的意思是在 select 之后如果点击另一个 link 或按钮重定向到另一个视图,
必须从列表中重新选择。
我希望他从下拉列表中选择一些东西后保留它(也适用于其他视图)直到他选择其他东西。(下拉列表存在于所有视图中)
类似于全局变量,它从下拉列表中 selected 中获取值。

我想做的是 serialise/deserialise 模型并从隐藏形式发送模型,但我会为每个按钮都这样做 link?

编辑
我的表格

@model Control2.ViewModels.VMStoreList 
 @using (Html.BeginForm())
            {
            <dt>Select Store</dt>

            <dd>@Html.DropDownListFor(p => Model.SelectedValue, Model.ItemsInDropDown, "select store", new { onchange = "this.form.submit()" }) </dd>

我的模型

public class VMStoreList
    {

        public Store Store { get; set; }
        public string SelectedValue { get; set; }
        public IEnumerable<SelectListItem> ItemsInDropDown { get; set; }

        //constructor that initialise the dropdown items
        public VMStoreList()
        {
             XDocument doc = new XDocument();
            doc = XDocument.Load("C:\Users\gnikolaidis\Desktop\Projects\Control2\Control\Settings\Stores.xml");

            List<Control2.Models.Store> Stores = Control2.Models.HelpFuncs.DeserializeParams<Control2.Models.Store>(doc);
            List<SelectListItem> ItemsInDropDown = new List<SelectListItem>();
            foreach (var Store in Stores)
            {
                SelectListItem i = new SelectListItem();
                i.Text = Store.StoreId;
                i.Value = Store.StoreId;
                ItemsInDropDown.Add(i);
                this.ItemsInDropDown = ItemsInDropDown;
             }
        }

        //This method has the selected value and initialise Store property
        public void Post()
        {
             XDocument doc = new XDocument();
            doc = XDocument.Load("C:\Users\gnikolaidis\Desktop\Projects\Control2\Control\Settings\Stores.xml");

            List<Store> Stores = Control2.Models.HelpFuncs.DeserializeParams<Store>(doc);
            var g = from s in Stores
                    where (s.StoreId == SelectedValue)
                                       select s;
            this.Store = g.FirstOrDefault();
            this.SelectedValue = SelectedValue;
            int a=6+7;



        }
    }

以及我在控制器中的操作

 public ActionResult Index()
        {


            return View();
        }

        [HttpPost]
        public ActionResult Index(VMStoreList Vmobject)
        {
            if (ModelState.IsValid)
            {
                Vmobject.Post();
            }
            return View(Vmobject);
        }

有2个选项。对于这两个选项,您都必须在客户端(本地 storage/cookie)或服务器端保存用户的选择,以便为后续请求呈现。

  • 您可以为所有需要的视图创建一个 _Layout 页面 用户显示的选定数据并继承此 _Layout。您还可以考虑将此添加到默认 _Layout 页面,因为您需要在所有视图中显示此信息。

  • 您可以创建一个PartialView并使用RenderPartial在需要显示的视图中显示所选商店。

    在这种方法中,您必须在您喜欢的所有视图中使用 RenderPartial 来显示所选商店的信息。这意味着传递给普通视图的所有 ViewModel 必须具有 DropDownList 和 Selected Store 的项目。仅当您想在少数几个视图中显示此信息时,此方法才有用。因为否则,您将必须在所有 ViewModel 中包含商店的额外模型信息。

例如,如果您有一个 CartViewModel,它将如下所示

Public Class CartViewModel
{
    Public List<CartItems> Items {get;set;}

    Public SelectedStore SelStore{get;set;}
}
Public Class SelectedStore
{
    Public string SelectedStore {get;set;} 
    Public List<StoreInfo> Stores {get;set;}
}

在你的 CartControllers Index 视图中你会调用

RenderPartial("_UserSelStore", Model.SelStore);

希望你明白了。

您可以将所选商店存储在 url 中并使用路由参数来处理它。

Eg: Your view without selected store:

http://yourapp/default/controller/action

Your view with selected store

http://yourapp/selectedstore/controller/action

你要做的是自定义路由(在routeconfig中):

 routes.MapRoute(
               name: "MyStore",
               url: "{store}/{controller}/{action}/{id}",
               defaults: new { controller = "Home", action = "Index", store = "default", id = UrlParameter.Optional }
           );

所以之后你可以在你的操作中请求选择的商店例如:

public async Task<ActionResult> MyStore(string store){
...
}

当用户更改下拉列表中的商店时,您所要做的就是在 url

中使用合适的商店名称刷新页面