将模型传递给所有视图 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);
}
有 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 中的良好商店名称刷新页面