将模型传递给所有视图mvc

时间:2015-01-12 20:01:33

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

我主要是出于练习原因试图用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>

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

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

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

修改
Myform

@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 个答案:

答案 0 :(得分:1)

有两种选择。对于这两个选项,您必须在客户端(本地存储/ 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);

希望你明白了。

答案 1 :(得分:0)

您可以将所选商店存储在网址中,并使用路线参数来处理它。

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){
...
}

当用户更改下拉列表中的商店时,您只需刷新网址中包含良好商店名称的页面