将模型传递给所有视图 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
中使用合适的商店名称刷新页面
主要是出于练习原因,我正在尝试使用 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
中使用合适的商店名称刷新页面