我正在实施一个网络系统来管理我公司的一些数据。我们正在使用MVC(更具体地说是ASP.NET MVC 4),我完全不熟悉它。
我遇到的问题是我们计划使用自动保存,就像GMail一样。我们计划使用排队的变更事件,偶尔通过ajax提交更改。首先,我会使用JavaScript,但不确定这是否是MVC的最佳方式。我遇到的另一个麻烦是用户输入的一些信息不是在表单内部,而是在表格中。页面的布局也有点稀疏,我不相信我可以将所有输入包装成单个表单,即使我应该这样做。
我的问题是:
注意:我已经看到了一些使用localstorage或其他客户端持久性的建议,但我需要的是服务器持久性,我们甚至没有页面上的保存按钮。
我在这里先向您的帮助表示感谢 ;)
您可以将form="myformid"
属性添加到表单外部的元素以将其包含在表单中。我会在开头的所有元素中添加data-dirty="false"
属性,并附加将更改元素的data-dirty属性更改为true的change事件。然后,您可以每30秒保存一次表格(获取data-change = true并传递给服务器的元素)。保存后,每个元素的data-dirty再次变为false。使用jQuery自动保存的示例:
window.setInterval(function(){
var dirtyElements = $('#myformid').find('[data-dirty=true]').add('[form=myformid][data-dirty=true]');
if(dirtyElements.length > 0){
var data = dirtyElements.serialize();
$.post('saveurl', data, function(){
dirtyElements.attr('data-dirty', false);
alert('data saved successfully');
});
}
}, 30000); // 30 seconds
将事件附加到表单的所有元素:
$(function(){
var formElements = $('#myformid')
.find('input, select, textarea')
.add('[form=myformid]')
.not(':disabled')
.each(function(){
$(this).attr('data-dirty', false).change(function(){
$(this).attr('data-dirty', true);
});
});
});
答案...
FormCollection
参数或经典的Form["fieldname"]
方法从控制器访问任何表单域。只要您的表格单元格具有唯一的name
值,您就可以获取数据form
中放一张桌子;这没什么不对。我建议使用适当的输入,这样很容易序列化数据并将其发送到服务器。1)使用Javascript! jQuery使用AJAX调用可以非常轻松地在后台异步执行自动保存。
2)我没有意识到,但它不应该太难。
3)不,不幸的是你不能,但你可以这样做:
<table id="mainTable">
<tr>
<td>
<form id="someForm">
<table class="aSubTable">
<tr>
<td><!-- fields go here --></td>
<td><!-- fields go here --></td>
</tr>
</table>
</form>
</td>
<tr>
</table>
(我知道这个示例代码没有利用Razor,但是用你自己的方法找出用Razor替换哪些部分应该不难)
您可以使用SignalR集线器在页面和服务器之间动态通信。有关此技术的详细信息,请参阅https://github.com/SignalR/SignalR/wiki和http://signalr.net/。
这样,您可以将更改事件直接发送到服务器。您可以使用JavaScript中的生产者 - 消费者模型来限制它们,但SignalR的性能足够好,您应该能够在不必执行此操作的情况下逃脱。
您可以在表单中嵌入表,但SignalR再次使用不同的客户端到服务器通信方式。
祝你好运。
we can Auto save form using Ajax
function AutoSaveMyForm(spanid) {
var dataToPost = $("form").serialize()
$.ajax({
type: "POST",
url: "/MyController/AutoSaveActionMethod",
data: dataToPost,
cache: false,
success: function(resultdata) {
if (resultdata['Code'] == '1') { // show success saved
console.log(resultdata['ResultMsg']);
if (spanid == "SaveLastStep") {
window.location = "/Dashboard/Index";
}
$('#' + spanid).html('Save Successfully.');
} else if (resultdata['Code'] == '0') { // show error
console.log(resultdata['ResultMsg']);
$('#' + spanid).html('Not Saved');
} else { // an error has occured
$('#' + spanid).html('Error Generated.');
}
}
});
}
window.setInterval(function() {
AutoSaveMyForm('SpanIdToShowResult')
}, 60000); // 1 min
By using set interval method we can call javascript method which call ajax to save form and pass any span id to get result back
仅针对您的问题1的部分答案:是的,开箱即用,mvc 4将使用javascript(jquery)和ajax工作得很好
上面的答案向您展示了在剃刀视图中编写javascript / ajax的一些方法,然后您将与控制器(应该从“模型”获取数据)进行通信,然后是整个.net mvc框架体验的一部分与各种设置相关联,然后您可以在更改值为false时测试web.config
例
在你的web.config中,你会看到
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
MVC 3甚至可以很好地工作:
<appSettings>
<add key="webpages:Version" value="1.0.0.0" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>