【发布时间】:2017-01-31 08:44:10
【问题描述】:
我试图将大问题最小化为一个小问题,因此我创建了新的示例 Web 项目; VS 中的 mvc-empty。我在 Home 控制器中创建了一个名为“Index”的视图。索引查看代码:
@model WebApplication16.ViewModels.Home.IndexVM
@{
ViewBag.Title = "Index";
}
@Html.Partial("~/Views/Home/_Orders.cshtml", Model.Orders)
@section scripts{
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
<script>
$("#Type").change(function () {
$('#order-current > img').remove();
var currentOrder = "#Type_" + $("#Type").find('option:selected').text();
var $img = $(currentOrder).clone();
$img.removeClass("hidden");
$("#order-current").append($img);
$("#ajax-form").submit();
});
</script>
}
家庭控制器代码:
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
IndexVM dataVM = new IndexVM();
GetControlsDataSource(dataVM.Orders);
return View(dataVM);
}
private static void GetControlsDataSource(OrdersVM dataVM)
{
List<SelectListItem> typeControlDataSource = new List<SelectListItem>();
foreach (var en in Enum.GetValues(typeof(TypeEnum)))
{
SelectListItem item = new SelectListItem();
item.Text = en.ToString();
item.Value = ((int)en).ToString();
typeControlDataSource.Add(item);
}
dataVM.TypeControlDataSource = typeControlDataSource;
}
[HttpPost]
public ActionResult Pay(IndexVM dataVM)
{
GetControlsDataSource(dataVM.Orders);
if (ModelState.IsValid)
{
dataVM.Orders.Info = "Info bla bla bla";
return PartialView("~/Views/Home/_Orders.cshtml", dataVM.Orders);
}
else
{
return View(dataVM);
}
}
}
还有一个名为“_Orders”的局部视图,在Index视图上渲染。_Orders局部视图的代码:
@model WebApplication16.ViewModels.Home.OrdersVM
@using (Ajax.BeginForm("Pay", "Home", new AjaxOptions
{
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "result",
}, new { id = "ajax-form" }))
{
<div id="result">
<div id="order-current">
</div>
<div>
@Html.TextBoxFor(x => x.Name, new { @class = "form-control", style = "margin-top:10px;", id = "Name" })
@Html.ValidationMessageFor(x => x.Name)
</div>
<div>
@Html.DropDownListFor(x => x.Type, Model.TypeControlDataSource, new { @class = "form-control", style = "margin-top:10px;", id = "Type", })
@Html.ValidationMessageFor(x => x.Type)
</div>
<div>
<p>@Model.Info</p>
</div>
<button type="submit" class="btn btn-primary" name="ok"> OK</button>
</div>
}
<div id="orders-container">
<img id="Type_I" src="~/App_Images/Type_I.png" class="img-responsive hidden" />
<img id="Type_II" src="~/App_Images/Type_II.png" class="img-responsive hidden" />
<img id="Type_III" src="~/App_Images/Type_III.png" class="img-responsive hidden"/>
</div>
Index model is described by class IndexVM:
public class IndexVM
{
public IndexVM()
{
this.Orders = new OrdersVM();
}
public OrdersVM Orders { get; set; }
}
_Orders 模型由 OrdersVM 类描述:
public class OrdersVM
{
[Required]
public string Name { get; set; }
public string Info { get; set; }
[Required]
public TypeEnum Type { get; set; }
public List<SelectListItem> TypeControlDataSource { get; set; }
}
public enum TypeEnum
{
I,
II,
III
}
在 id=”Type” 的 DropDownListFor 控件中更改值后,应通过位于 Index 视图中的 jquery 代码将隐藏字段中的图片注入到 id=”order-current” 的容器中,然后操作 ajax-form应提交。它工作正常,但调用后
return PartialView("~/Views/Home/_Orders.cshtml", dataVM.Orders);
在 HomeController 中,字段 Info 已正确更新,但从“order-current” div 容器中注入的图片消失了。我尝试使用 F12 按钮查看 Google Chrome 中有什么问题,没有错误,但在“browserLink”脚本中出现了无限循环。我无法解释为什么。 我只想在提交 ajax-form 后在 id=”order-current 的容器中看到注入的图片。如何做到这一点,我做错了什么?
【问题讨论】:
标签: javascript c# jquery ajax asp.net-mvc