Приложение Facebook, Заботы Iframe (проблема URL)

Так как вы не пытаетесь опубликовать коллекцию в одном представлении, вам нужно потерять указатель на название модели.

Tasks[0].TaskId

Настройте ваши взгляды. Имя переменной «задача» должно соответствовать параметру действия, поскольку HtmlHelpers будет генерировать атрибуты имени на основе этой строки.

@model Checkpoint.Models.Checklist
<table>
    @foreach(Task task in Model.Tasks)
    {
        @Html.EditorFor(m => task)
    }
</table>

Рендеринг html выглядит примерно как

<input id="task_TaskId" name="task.TaskId" type="hidden" value="1">
...

Для действия требуется параметр «task» для сопоставления, чтобы связать его значения

[HttpPost]
public ActionResult Index(Task task)
{
    return Content($"Save Task:{task.TaskId} Value:{task.IsDone}");
}

Если мы используем частичное представление вместо шаблона редактора мы можем немного ослабить зависимость имени от «задачи».

@model Checkpoint.Models.Checklist
<table>
    @foreach(Task t in Model.Tasks)
    {
        @Html.PartialView("_TaskForm", t)
    }
</table>

И ваш шаблонный редактор будет работать точно так же.

_TaskForm

@model Checkpoint.Models.Task
<tr>
    <td>@Model.TaskName</td>
    <td data-ftid="@Model.TaskId">
        @{
            using (Html.BeginForm("Index", "Check", FormMethod.Post))
            {
                @Html.HiddenFor(x => x.TaskId)
                @Html.RadioButtonFor(x => x.IsDone, false)<span>Incomplete</span>
                @Html.RadioButtonFor(x => x.IsDone, true)<span>Complete</span>
                <button role="button" type="submit" name="taskAction">Submit</button>
            }
        }
    </td>
</tr>

И отрендеренный html

<input id="TaskId" name="TaskId" type="hidden" value="1">
...

Гоча со всем вышеупомянутым атрибутом html id не будет уникальным. Поэтому, если это важно, вам нужно будет вручную выполнить итерацию коллекции, чтобы построить каждую форму вручную, чтобы вы могли точно указать значения идентификатора. То есть вы потеряете небольшие модульные редакторы шаблонов.

Позволяя фреймворку автоматически генерировать «уникальные» идентификаторы ... мы переопределяем атрибут name (обратите внимание на прописную букву для «Name»), который мы имеем:

@model Checkpoint.Models.Checklist
<table>
    @for(int i = 0; i < Model.Tasks.Count; i++)
    {
        <tr>
           <td>@Model.Tasks[i].TaskName</td>
           <td data-ftid="@Model.Tasks[i].TaskId">
               @using (Html.BeginForm("Index", "Check", FormMethod.Post))
               {
                   @Html.HiddenFor(x => Model.Tasks[i].TaskId, new { Name="TaskId" })
                   @Html.RadioButtonFor(x => Model.Tasks[i].IsDone, false, new { Name="IsDone" })<span>Incomplete</span>
                   @Html.RadioButtonFor(x => Model.Tasks[i].IsDone, true, new { Name="IsDone" })<span>Complete</span>
                   <button role="button" type="submit" name="taskAction">Submit</button>
              }
           </td>
       </tr>
    }
</table>
6
задан Swamy g 27 February 2009 в 14:48
поделиться

2 ответа

Вместо

<a href="http://fbapp.mysite.com/page1">link</a>

Использовать

<a href="http://apps.facebook.com/{canvasurl}/page1" target="_top">link</a>

Это загрузит URL в самом верхнем кадре (сам Facebook), и Facebook автоматически проходит через любые аргументы (пути И строки запроса) к Вашему URL обратного вызова.

10
ответ дан 10 December 2019 в 00:45
поделиться
    FB_RequireFeatures(["CanvasUtil"], function() { 
    FB.Facebook.init(<api_key>, <path to xd_receiver>);
    FB.CanvasClient.startTimerToSizeToContent();
    FB.CanvasClient.syncUrl(); 
});
0
ответ дан 10 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: