В основном проблема заключается в том, что связующее устройство по умолчанию не может правильно привязать элементы коллекции в цикле foreach. Другими словами, он неправильно называет элемент, и поэтому коллекция отображается как нуль в параметрах.
Я уверен, что есть разные способы обхода, помощники и прочее, но я не знаком с этими , поэтому я просто использую for loop вместо foreach, таким образом, элементы называются правильно.
Попробуйте это:
@for (int i = 0; i < Model.Contributor.Count(); i++)
{
@Html.HiddenFor(model => Model.Contributor[i].Id)
<div class="formrow">
@Html.ValidationSummary(true)
</div>
<h2>@Html.TextRaw("AuthorInfo", "Author")</h2>
<div class="formrow">
@Html.EditorFor(model => Model.Contributor[i].FirstName)
<div class="formvalidation">
@Html.ValidationMessageFor(model => Model.Contributor[i].FirstName)
</div>
</div>
<div class="formrow right">
<input type="hidden" name="formsubmitted" value="true" />
<input type="submit" class="button" value="@Html.Text("ButtonText", "Save")" />
</div>
}
Я предлагаю вам использовать инструмент отладки, чтобы узнать, элементы имеют правильный атрибут имени, в вашем случае они должны выглядеть как Contributor [0] .Id, Contributor [0] .FirstName и т. д.
Это потому, что ваша программа toLog ожидает, что вы предоставите параметр @messageTime, чего вы не сделали, и он не имеет значения по умолчанию, как другие параметры.
Так как вы устанавливаете @messageTime всегда в GETDATE() внутри макроса, похоже, что вы просто хотите отбросить этот параметр:
CREATE PROCEDURE dbo.toLog
@etlJobName NVARCHAR(60) = 'unknown',
@whereTo NVARCHAR(20) = 'print',
@messag NVARCHAR(255) = 'empty'
AS
BEGIN
IF @whereTo = 'log' OR @whereTo = 'logandprint'
INSERT INTO logTable(messageTime, etlJobName, whereTo, messag)
VALUES (GETDATE(), @etlJobName, @whereTo, @messag)
IF @whereTo = 'print' OR @whereTo = 'logandprint'
PRINT CONVERT(VARCHAR, GETDATE(), 113) + ', ' + @etlJobName + ', ' + @whereTo + ', ' + ', ' + @messag
END
Или, если вы хотите иметь возможность передавать дату самостоятельно:
CREATE PROCEDURE dbo.toLog
@messageTime DATETIME = null,
@etlJobName NVARCHAR(60) = 'unknown',
@whereTo NVARCHAR(20) = 'print',
@messag NVARCHAR(255) = 'empty'
AS
BEGIN
IF (@messagetime IS NULL) SET @messagetime = GETDATE()
IF @whereTo = 'log' OR @whereTo = 'logandprint'
INSERT INTO logTable(messageTime, etlJobName, whereTo, messag)
VALUES (@messageTime, @etlJobName, @whereTo, @messag)
IF @whereTo = 'print' OR @whereTo = 'logandprint'
PRINT CONVERT(VARCHAR, @MessageTime, 113) + ', ' + @etlJobName + ', ' + @whereTo + ', ' + ', ' + @messag
END