我正在使用jQuery.load()
呈现部分视图。这部分看起来像这样:
$('#sizeAddHolder').load(
'/MyController/MyAction', function () { ... });
我的控制器中的操作代码如下:
public ActionResult MyAction(byte id)
{
var model = new MyModel
{
ObjectProp1 = "Some text"
};
return View(model);
}
[HttpPost]
public ActionResult MyAction(byte id, FormCollection form)
{
// TODO: DB insert logic goes here
var result = ...;
return Json(result);
}
我将返回一个看起来像这样的部分视图:
<% using (Html.BeginForm("MyAction", "MyController")) {%>
<%= Html.ValidationSummary(true) %>
<h3>Create my object</h3>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%= Html.LabelFor(model => model.ObjectProp1) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Size.ObjectProp1) %>
<%= Html.ValidationMessageFor(model => model.ObjectProp1) %>
</div>
div class="editor-label">
<%= Html.LabelFor(model => model.ObjectProp2) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.ObjectProp2) %>
<%= Html.ValidationMessageFor(model => model.ObjectProp2) %>
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
在这种情况下,客户端验证不起作用。更重要的是,包含验证消息的脚本也不包含在返回的视图中。我的模型类中的两个属性都具有Required
和StringLength
属性。
有没有办法在这样加载的视图中触发客户端验证?
答案 0 :(得分:7)
首先,您应该返回部分视图而不是视图。
return PartialView(model);
其次,您是否尝试使用AJAX加载此部分视图?在这种情况下,您可能希望使用jquery.ajax
function ajax_update(path)
$.ajax {
url: path,
success: function(result) {
$('#sizeAddHolder').html(result);
}
return false;
}
答案 1 :(得分:2)
您应该在ajax调用上使用dataType
function ajax_update(path)
$.ajax {
url: path,
dataType: "html",
success: function(result) {
$('#sizeAddHolder').html(result);
}
return false;
}
来自jQuery docs:
的dataType 默认值:智能猜测(xml,json,script或html)
您期望从服务器返回的数据类型。如果没有指定,jQuery将智能地尝试获取结果,基于响应的MIME类型(XML MIME类型将产生XML,在1.4 JSON中将产生一个JavaScript对象,在1.4脚本中将执行脚本,以及任何东西else将作为字符串返回)。可用的类型(以及作为成功回调的第一个参数传递的结果)是:
* "xml": Returns a XML document that can be processed via jQuery.
* "html": Returns HTML as plain text; included script tags are evaluated when inserted in the DOM.
* "script": Evaluates the response as JavaScript and returns it as plain text. Disables caching unless option "cache" is used. Note: This will turn POSTs into GETs for remote-domain requests.
* "json": Evaluates the response as JSON and returns a JavaScript object. In jQuery 1.4 the JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. (See json.org for more information on proper JSON formatting.)
* "jsonp": Loads in a JSON block using JSONP. Will add an extra "?callback=?" to the end of your URL to specify the callback.
* "text": A plain text string.
答案 2 :(得分:1)
我不确定你是否仍然在回答你的问题,但我写了一篇关于使AJAX加载表单与ASP.NET MVC 2中的客户端验证一起工作的帖子: http://tpeczek.com/2010/04/making-aspnet-mvc-2-client-side.html
答案 3 :(得分:1)
问题是加载了ajax的表单永远不会在Microsoft验证中注册。要解决它,请调用以下函数Sys.Mvc.FormContext._Application_Load。
function ajax_update(path)
$.ajax {
url: path,
success: function(result) {
$('#sizeAddHolder').html(result);
Sys.Mvc.FormContext._Application_Load();
}
return false;
}
那应该解决它。另外,请确保通过ajax加载的表单具有唯一的ID。否则,验证将失败。
避免使用load()。它会删除响应中加载的所有脚本。
答案 4 :(得分:1)
答案 5 :(得分:0)
在html文件中,您可以使用以下内容:
抱歉,但我不知道如何发布链接HTML。因此,您可以拥有类 =“删除”链接, ID = 值和 href =“javascript: ;“然后我用这个函数渲染局部视图:
$(".delete").click(function(event){
var id = $(".select").attr("id");
var id2 = event.target.id;
$.ajax({
url: "Persona/Delete?idPersona=" + id2.toString(),
success: function (data) {
$("#popUpConfirmar").html(data);
}
});
dialogoPopUp.dialog("open");
});
请记住,在控制器中,您必须执行以下操作:
public PartialViewResult Delete(int idPersona)
{
PersonaDataAccess personaDataAccess = new PersonaDataAccess();
Persona persona = personaDataAccess.GetOne(idPersona);
return PartialView("Delete",persona);
}