我有一个基本的LogSearchModel类,它具有以下属性:
public class LogSearchModel
{
public int Id { get; set; }
public string UserName { get; set; }
public string LogType {get; set; }
}
另外,我有两个继承类:
public class ActivityLogSearchModel : LogSearchModel
{
public string Message { get; set; }
}
public class ErrorLogSearchModel : LogSearchModel
{
public string ErrorMessage { get; set; }
}
我有一个Razor视图,其中包含基本LogSearchModel类属性的编辑器,如下所示:
@model LogSearchModel
@Html.EditorFor(model => model.Id)
@Html.EditorFor(model => model.UserName)
@Html.EditorFor(model => model.LogType)
logtype编辑器实际上是一个剑道下拉列表,仅限于"活动日志"和"错误日志"值。根据此下拉列表的值,将进行Ajax调用,并显示带有编辑器的额外部分视图,用于继承类的属性:
对于ActivityLogSearchModel,呈现的视图将是:
@model ActivityLogSearchModel
@Html.EditorFor(model => model.Message)
对于ErrorLogSearchModel,呈现的视图将是:
@model ErrorLogSearchModel
@Html.EditorFor(model => model.ErrorMessage)
我想要做的是,点击一个按钮,继承模型通过AJAX提交给我的控制器中的一个动作方法,该方法接收基类作为参数。
public ActionResult Search(LogSearchModel logSearchModel){
var activityLogModel = logSearchModel as ActivityLogSearchModel;
if(activityLogModel != null){ /*do something*/ };
var errorLogModel = logSearchModel as ErrorLogSearchModel;
if(errorLogModel != null){ /*do something*/ };
}
我已经测试了这种方法,但是在转换结果时总是为null。因此,我尝试创建两个动作方法,一个接收ActivityLogSearchModel,另一个接收ErrorLogSearchModel作为参数。但是,在提交表单时,我无法检索继承类的属性。以下代码是我对从Activity部分视图触发的提交事件的AJAX调用
var combinedSearchCriteria = combineObjects(logSearchModel, activitySearchModel);
function combineObjects(generalSearch, activitySearch) {
$.extend(generalSearch, activitySearch);
return generalSearch;
}
$.ajax({
url: "@Url.Action("SearchActivity", "Log")",
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({ logSearchModel: combinedSearchCriteria }),
success: function(data) {
$('#extraSearchFields').html(data);
}
});
提交此ajax调用时,只有基类模型属性映射到action方法中的参数,并且继承类属性设置为null。
我是否可以遵循其他方法将继承类提交到包含部分视图的操作方法中?