初识MVC web框架--Controller与View交互1

在基于Web框架开发的软件中,Controller和View之间传递数据是常有的,下面我们来领略下Controller与View各种数据交互方式的风采。

 

方式一:ViewBag\ViewData\TempData

ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary),TempData的使用
同ViewData和ViewBag一样,TempData也可以用来向视图传递数据。只是ViewData和ViewBag的生命周期和View相同,只对当前View有用。而TempData则可以在不同的Action中进行传值。
1. ViewData与TempData方式是弱类型的方式传递数据,而使用Model传递数据是强类型的方式。
2. ViewData与TempData是完全不同的数据类型,ViewData数据类型是ViewDataDictionary类的实例化对象,而TempData的数据类型是TempDataDictionary类的实例化对象。
3. TempData实际上保存在Session中,控制器每次执行请求时都会从Session中获取TempData数据并删除该Session。TempData数据只能在控制器中传递一次,其中的每个元素也只能被访问一次,访问之后会被自动删除。
4. ViewData只能在一个Action方法中进行设置,在相关的视图页面读取,只对当前视图有效。理论上,TempData应该可以在一个Action中设置,多个页面读取。但是,实际上TempData中的元素被访问一次以后就会被删除。
5. 在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData。MVC3中保留了ViewData的使用,有关他们之间的区别可以参考这个文章。  
Controller里面赋值:
public ActionResult Index()
{
ViewBag.hello = "hello,this is viewBag";
ViewData["hi"] = "hi,this is viewData";
TempData["abc"] = "this is tempdata";
return View();
}
View里面调用:
<h2>关于</h2> <p> @ViewBag.hello @ViewData["key"] @TempData["abc"] </p>

 

 

方式二:Form表单Model传值

View层表单代码:

 

 

@model SaleOrderViewModel

@using (Html.BeginForm("SalesOrderEdit", "Order", FormMethod.Post, new { id = "SalesOrderEditForm", enctype = "multipart/form-data" }))
{

@Html.HiddenFor(m => m.SaleOrderID)
<div class="form-horizontal">
<div class="page-header">
<h3>@this.Intl("Common.BasicInfo")</h3>
</div>
<div class="form-group">
@Html.ResourceLabelFor(model => model.SaleOrderNo, new { @class = "control-label col-md-2 field-required" })

<div class="col-md-4">
@Html.TextBoxFor(model => model.SaleOrderNo, new { @class = "form-control", @readonly = "readonly" })
@Html.ResourceValidationMessageFor(model => model.SaleOrderNo, "", new { @class = "text-danger" })
</div>

@Html.ResourceLabelFor(model => model.OrderDate, new { @class = "control-label col-md-2 field-required" })

<div class="col-md-4">
@Html.TextBoxFor(model => model.OrderDate, new { @class = "form-control datepicker" })
@Html.ResourceValidationMessageFor(model => model.OrderDate, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-4">
<input type="submit" value="@this.Intl("Common.Save").ToString()" class="btn btn-primary" />
<input type="submit" name="SaveAndSubmit" value="@this.Intl("Common.SaveAndSubmit").ToString()" class="btn btn-primary" />
@Html.ActionLink(this.Intl("Common.Cancel").ToString(), "SalesOrderList", null, new { @class = "btn btn-default" })
</div>
</div>
</div>
}

 

 

Controller层代码,获取某ID销售数据:

public ActionResult SalesOrderEdit(int saleOrderID)
{
SaleOrder saleOrder = _saleOrderService.FindSaleOrder(saleOrderID);
if (saleOrder == null)
{
return HandError();
}

if (!saleOrder.IsRetail)
{
return RedirectToAction("DisSalesOrderEdit", new { saleOrderID = saleOrderID });
}

saleOrder.Customer = _basicDataService.GetCustomerByCode(saleOrder.CustormerCode);
saleOrder.Delivery = _basicDataService.GetDeliverierByCode(saleOrder.DeliveryCode);
SaleOrderViewModel saleOrderViewModel = saleOrder.ToModel();

//附件
IList<Attachment> attachments = _basicDataService.LoadAttachment(saleOrderViewModel.RefID);
saleOrderViewModel.Attachments = new List<AttachmentOrderView>();
foreach (Attachment attachment in attachments)
{
saleOrderViewModel.Attachments.Add(attachment.ToOrderView());
}

return View(saleOrderViewModel);
}
```
Controller层代码,编辑某ID销售数据:

```
// <summary>
/// 自有业务销售订单表单编辑 Post
/// </summary>
/// <param name="saleOrder"></param>
/// <returns></returns>
[HttpPost, NamedFormParameter("SaveAndSubmit", "saveAndSubmit")]
[ValidateAntiForgeryToken()]
public ActionResult SalesOrderEdit(SaleOrderViewModel saleOrderViewModel, bool saveAndSubmit)
{
try
{
saleOrderViewModel.ModifyBy = this.UserName;
saleOrderViewModel.ModifyDate = DateTime.Now;

if (saleOrderViewModel.Attachments != null)
{
//附件
foreach (AttachmentOrderView attachmentOrderView in saleOrderViewModel.Attachments)
{
if (attachmentOrderView.EditStatu == "d")
{
Utils.DeleteFile(attachmentOrderView.FileName);
_basicDataService.RemoveAttachment(attachmentOrderView.AttachmentID);
}
}
}
SaleOrder saleOrder = saleOrderViewModel.ToEntity();
IList<Attachment> attachments = new List<Attachment>();
Utils.UploadFileBatch(Request.Files, attachments, saleOrder.RefID);
_basicDataService.SaveAttachments(attachments);

_saleOrderService.UpdateSaleOrder(saleOrder);



return View("Finish", new List<string>() { this.Intl("Common.Message.SaveSuccessfully"), "SalesOrderList" });
}
catch (Exception e)
{
Util.Logger.Error(e.Message, e);
return View("Finish", new List<string>() { this.Intl("Common.Message.SaveFailed"), "SalesOrderList" });
}
}

 

方式三:异步加载,json传值

还是以销售订单为例,我们删除一个ID的订单,销售列表的删除按钮View层代码:

 

 <a class="delete btn btn-default btn-xs btn-delete" href="#" data-puorderid="@m.SaleOrderID">@this.Intl("Common.Delete").ToHtmlString()</a>
javascript代码:

<script type="text/javascript">
$(document).ready(function () {
$("#salesordertb a.delete").bind("click", function () {
if (confirm("@this.Intl("Common.ReConfirmDelete")")) {
var data = "saleOrderID=" + $(this).attr("data-saleorderid");
var ajxoptioan = {
url: "@Url.Action("SalesOrderDelete")",
type: 'Post',
async: false,
dataType: 'json',
data: data,
context: this,
success: function (result) {
if (result.ReMsg == true) {
$('#SalesOrderListForm').submit();
}
else {
ShowNotice(result.ReMsg, "danger");
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
ShowNotice(XMLHttpRequest[1], "danger");
}
}
$.ajax(ajxoptioan);
}
});
});

</script>
Controller层代码:

/// <summary>
/// 销售订单 ajax删除
/// </summary>
/// <param name="inStoreID"></param>
/// <returns></returns>
public ActionResult SalesOrderDelete(int saleOrderID)
{
bool result = false;
string message = this.Intl("Common.Message.DeleteFailed");
try
{
result = this._saleOrderService.RemoveSaleOrder(saleOrderID) > 0;
if (result)
{
this.SuccessNotice(this.Intl("Common.Message.DeleteSuccessfully"));
}
return Json(new { ReMsg = result }, JsonRequestBehavior.AllowGet);
}
catch (Exception e)
{
message += "<br/>" + e.Message;
return Json(new { ReMsg = message }, JsonRequestBehavior.AllowGet);
}
}
```
文章转载自:华晨软件-[云微学院](http://www.hocode.com/) » [初识MVC框架-

 

 

 

文章转载自:云微平台-云微学院 » 初识MVC框架–Controller与View交互1
本文标题:初识MVC web框架–Controller与View交互1
本文地址:http://www.my-framework.com/OrgTec/Back/0002.html

 

 

上一篇:MVC 向页面传值方式总结(1)


下一篇:从控制器到视图的数据传递