以前关注过ASP.NET MVC, 但没有开发过具体项目。偶然的机会,接了一个开发类似Facebook网站功能的私活。突发奇想,何不试一试MVC呢?刚开始似乎还算顺利,但不久就发现不简单。最近一两天,翻来覆去鼓捣:Html.Partial、Html.RenderPartial、Html.RenderAction、Html.Action、ViewData、ViewBag、TempData。仍然不得要领。因此求教各路神仙指点迷津。我的问题是:一个页面包含多个Html.Partial(相当于ASP.NET 的User Control),每个Html.Partial都有自个的提交按钮(Submit Button)。我发现当点击某个子页面(Html.Partial)的按钮时,其他子页面(Html.Partial)的内容变成了Null Values。保存其他子页面的值可以使用Session来解决,但我觉得应该有更好的方法,请各位朋友赐教,谢谢。1. Controller and ViewModel
namespace Friends.Web.Models
{
public class ParentViewModel
{
public Partial1ViewModel Partial1VM { get; set; }
public Partial2ViewModel Partial2VM { get; set; } public ParentViewModel()
{
Partial1VM = new Partial1ViewModel();
Partial2VM = new Partial2ViewModel();
}
} public class Partial1ViewModel
{
public List<Company> Companies { get; set; } public Partial1ViewModel()
{
Companies = new List<Company>
{
new Company{ CompanyName = "Company1", IsInclude = false},
new Company{ CompanyName = "Company2", IsInclude = false}
};
}
} public class Partial2ViewModel
{
public List<Product> Products { get; set; } public Partial2ViewModel()
{
Products = new List<Product>
{
new Product{ ProductName = "Product1", IsInclude = false},
new Product{ ProductName = "Product2", IsInclude = false}
};
}
} public class Company
{
public string CompanyName { get; set; }
public bool IsInclude { get; set; }
} public class Product
{
public string ProductName { get; set; }
public bool IsInclude { get; set; }
}
}namespace Friends.Web.Controllers
{
public class PartialController : Controller
{
public ActionResult PartialParent()
{
return View(new ParentViewModel());
} [HttpPost]
public ActionResult PartialParent(ParentViewModel vm, Partial1ViewModel vm1, Partial2ViewModel vm2)
{
return View(vm);
}
}
}
2. PartialParent.cshtml, SubPartial1.cshtml and SubPartial2.cshtml
@model Friends.Web.Models.ParentViewModel <div>
@Html.Partial("SubPartial1", Model.Partial1VM)
</div><div>
@Html.Partial("SubPartial2", Model.Partial2VM)
</div>
@model Friends.Web.Models.Partial1ViewModel @using (Html.BeginForm())
{
for (int i = 0; i < Model.Companies.Count(); i++)
{
<div>
@Html.CheckBoxFor(m => m.Companies[i].IsInclude)
@Html.DisplayFor(m => m.Companies[i].CompanyName)
</div>
}
<input type="submit" value="Send selected items"/>
}
@model Friends.Web.Models.Partial2ViewModel @using (Html.BeginForm())
{
for (int i = 0; i < Model.Products.Count(); i++)
{
<div>
@Html.CheckBoxFor(m => m.Products[i].IsInclude)
@Html.DisplayFor(m => m.Products[i].ProductName)
</div>
}
<input type="submit" value="Send selected items"/>
}
namespace Friends.Web.Models
{
public class ParentViewModel
{
public Partial1ViewModel Partial1VM { get; set; }
public Partial2ViewModel Partial2VM { get; set; } public ParentViewModel()
{
Partial1VM = new Partial1ViewModel();
Partial2VM = new Partial2ViewModel();
}
} public class Partial1ViewModel
{
public List<Company> Companies { get; set; } public Partial1ViewModel()
{
Companies = new List<Company>
{
new Company{ CompanyName = "Company1", IsInclude = false},
new Company{ CompanyName = "Company2", IsInclude = false}
};
}
} public class Partial2ViewModel
{
public List<Product> Products { get; set; } public Partial2ViewModel()
{
Products = new List<Product>
{
new Product{ ProductName = "Product1", IsInclude = false},
new Product{ ProductName = "Product2", IsInclude = false}
};
}
} public class Company
{
public string CompanyName { get; set; }
public bool IsInclude { get; set; }
} public class Product
{
public string ProductName { get; set; }
public bool IsInclude { get; set; }
}
}namespace Friends.Web.Controllers
{
public class PartialController : Controller
{
public ActionResult PartialParent()
{
return View(new ParentViewModel());
} [HttpPost]
public ActionResult PartialParent(ParentViewModel vm, Partial1ViewModel vm1, Partial2ViewModel vm2)
{
return View(vm);
}
}
}
2. PartialParent.cshtml, SubPartial1.cshtml and SubPartial2.cshtml
@model Friends.Web.Models.ParentViewModel <div>
@Html.Partial("SubPartial1", Model.Partial1VM)
</div><div>
@Html.Partial("SubPartial2", Model.Partial2VM)
</div>
@model Friends.Web.Models.Partial1ViewModel @using (Html.BeginForm())
{
for (int i = 0; i < Model.Companies.Count(); i++)
{
<div>
@Html.CheckBoxFor(m => m.Companies[i].IsInclude)
@Html.DisplayFor(m => m.Companies[i].CompanyName)
</div>
}
<input type="submit" value="Send selected items"/>
}
@model Friends.Web.Models.Partial2ViewModel @using (Html.BeginForm())
{
for (int i = 0; i < Model.Products.Count(); i++)
{
<div>
@Html.CheckBoxFor(m => m.Products[i].IsInclude)
@Html.DisplayFor(m => m.Products[i].ProductName)
</div>
}
<input type="submit" value="Send selected items"/>
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货