将模型传递给所有视图 mvc

本文关键字:视图 mvc 模型 | 更新日期: 2023-09-27 18:37:12

我尝试用 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>

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

我正在寻找将特定模型转移到所有其他视图的好方法。
我的意思是,如果单击其他链接或按钮重定向到其他视图,则选择某些内容后,
将不得不从列表中再次选择。
我希望在他从下拉列表中选择某些内容后保留它(也保留其他视图),直到他选择其他内容。(下拉列表存在于所有视图中)
类似于全局变量的东西,它从下拉列表中选择的值中获取值。

我想做的是序列化/反序列化模型并从隐藏形式发送模型,但我必须为每个按钮和链接执行此操作?

编辑
我的形状

@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);
        }

将模型传递给所有视图 mvc

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

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

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

    此方法中,您必须在要查看的所有视图中使用RenderPartial以显示所选商店信息。这意味着传递到普通视图的所有 ViewModel 都必须具有DropDownList和所选商店的物料。仅当您希望在少数视图中显示此信息时,此方法才有用。否则,您必须在所有 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

你要做的是一个自定义路由(在路由配置中):

 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 中的良好商店名称刷新页面